Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Code d'authentification de message
Les flux de messages sont utilisés pour configurer le switch audio. Consultez
Messages de switch audio : Pour ces configurations importantes, le fournisseur a besoin
pour s'assurer que le message est envoyé par GMSCore (module Association express) et non par
une autre application sur Seeker.
Générer un code d'authentification de message (MAC)
FP Seeker ajoute un code d'authentification de message pour les messages de configuration de l'appareil
à l'aide de HMAC-SHA256. Le MAC du message comprend les huit premiers octets de:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
où
- K est généré par concat(clé de compte, zéros de 48 octets).
- message correspond aux données supplémentaires du flux de messages.
- nonce est généré par concat(session_nonce, message_nonce); séance
Le nonce et le nonce du message sont définis dans la section suivante.
- opad correspond à 64 octets de marge intérieure extérieure, composée d'octets répétés de valeur
0x5C
- ipad correspond à 64 octets de marge intérieure interne, composée d'octets répétés de valeur
0x36
Nonce de session et nonce de message
Pour empêcher une attaque par rejeu, le fournisseur doit s'assurer qu'un nonce n'est pas
répété. Étant donné que le maintien de la synchronisation de l'horloge ou du compteur sur les deux fournisseurs
et qu'il ne soit pas simple, le fournisseur génère le nonce de session
(par connexion), qui est partagé avec tous les messages durant la connexion,
tandis qu'il génère le nonce du message (par message), qui est aléatoire
générées pour chaque message. Le nonce permettant de générer l'adresse MAC
de chaque message est
la combinaison du nonce de session et du nonce de message,
concat(session_nonce, message_nonce).
Nous ajoutons un nonce de session au groupe d'événements "Informations sur l'appareil" :
Nom du groupe de messages |
Valeur |
Événement lié aux informations sur l'appareil |
0x03 |
Nom du code du message |
Valeur |
Nonce de session |
0x0A |
Le nonce de session doit être généré et envoyé au Seeker lorsque RFCOMM
connecte:
Octet |
Type de données |
Description |
Valeur |
0 |
uint8 |
Événement lié aux informations sur l'appareil |
0x03 |
1 |
uint8 |
Nonce de session |
0x0A |
2 à 3 |
uint16 |
Longueur de données supplémentaire |
0x0008 |
4 – 11 |
|
Nonce de session |
varie |
Pour envoyer un message lorsqu'un MAC est requis, le Seeker enverra un nonce de message
et le MAC avec le message.
Octet |
Type de données |
Description |
Valeur |
0 |
uint8 |
Groupe de messages |
varie |
1 |
uint8 |
Code du message |
varie |
2 à 3 |
uint16 |
Longueur de données supplémentaire(longueur des données supplémentaires + 16) |
varie |
4 - n |
|
Données supplémentaires |
varie |
n + 1 - n + 8 |
|
Nonce du message |
varie |
n + 9 - n + 16 |
|
Code d'authentification du message |
varie |
Valider l'adresse MAC (code d'authentification des messages)
À la réception d'un message contenant ce code, le fournisseur
doit la vérifier en utilisant la même fonction que la fonction génératrice. En d'autres termes,
le MAC reçu doit être égal
aux 8 premiers octets de
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
où :
- K est généré par
concat(account key, 48-byte ZEROs)
, et le fournisseur
doit balayer toutes les clés de compte
stockées pour vérifier le MAC.
- message est les données supplémentaires (à l'exclusion du nonce et de l'adresse MAC du message) de
le flux de messages.
Si le MAC est correct, le Fournisseur doit suivre les instructions du
. Sinon, le fournisseur enverra une NAK avec le motif de l'erreur, 0x3 -
non autorisée en raison d'un code d'authentification de message incorrect.
Sauf indication contraire, le contenu de cette page est régi par une licence Creative Commons Attribution 4.0, et les échantillons de code sont régis par une licence Apache 2.0. Pour en savoir plus, consultez les Règles du site Google Developers. Java est une marque déposée d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/08/13 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 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."]]