nonce는 concat(session_nonce, message_nonce)에 의해 생성됩니다. 세션
nonce와 메시지 nonce는 다음 섹션에서 정의됩니다.
opad는 값이 지정된 반복되는 바이트로 구성된 64바이트의 외부 패딩입니다.
0x5C입니다.
ipad는 값이 지정된 반복되는 바이트로 구성된 64바이트의 내부 패딩입니다.
0x36입니다.
세션 nonce 및 메시지 nonce
재생 공격을 방지하려면 제공자는 nonce가 종료되어 있지 않은지 확인해야 합니다.
반복되지 않습니다. 두 제공업체 모두에서 시계 또는 카운터 동기화를 유지하고 있으므로
Seeker는 간단하지 않으며 Provider는 세션 nonce를 생성합니다.
(연결당) - 연결 중 모든 메시지와 공유됩니다.
탐색자는 메시지당 메시지 nonce를 생성하는데 이는 무작위로
생성됩니다 각 메시지의 MAC을 생성하기 위한 nonce는
세션 nonce와 메시지 nonce의 조합입니다.
concat(session_nonce, message_nonce)
기기 정보 이벤트 그룹에 세션 nonce를 추가합니다.
메시지 그룹 이름
값
기기 정보 이벤트
0x03
메시지 코드 이름
값
세션 nonce
0x0A
RFCOMM에서 세션 nonce가 생성되어 탐색자에게 전송되어야 합니다.
연결:
옥텟
데이터 유형
설명
값
0
uint8
기기 정보 이벤트
0x03
1
uint8
세션 nonce
0x0A
2~3명
uint16
추가 데이터 길이
0x0008
4~11명
세션 nonce
다름
MAC가 필요할 때 메시지를 보내기 위해 탐색자는 메시지 nonce를 보냅니다
MAC 주소도 있습니다.
옥텟
데이터 유형
설명
값
0
uint8
메시지 그룹
다름
1
uint8
메시지 코드
다름
2~3명
uint16
추가 데이터 길이(추가 데이터 길이 + 16)
다름
4 - n
추가 데이터
다름
n+1~n+8
메시지 nonce
다름
n+9~n+16
메시지 인증 코드
다름
MAC (메시지 인증 코드) 확인
공급자는 메시지 인증 코드가 포함된 메시지를 수신하면
생성하는 함수와 동일한 함수를 사용하여 이를 확인해야 합니다. 즉,
수신된 MAC은
[null,null,["최종 업데이트: 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."]]