訊息驗證碼
訊息串流用於設定音訊自動切換,請參閱「音訊自動切換訊息」。對於這些重要設定,供應商必須確保訊息是由 GMSCore (快速配對模組) 傳送,而不是由 Seeker 上的任何其他應用程式傳送。
產生 MAC (訊息驗證碼)
FP Seeker 會使用 HMAC-SHA256,為裝置設定訊息新增訊息驗證碼。訊息的 MAC 包含前 8 個位元組:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
媒介
- K 是由 concat(帳戶金鑰、48 位元組的零) 產生。
- message 是 Message 串流的額外資料。
- nonce 是由 concat(session_nonce, message_nonce) 產生;session nonce 和 message nonce 的定義請見下節。
- opad 是 64 個位元組的外部填充,由值為
0x5C的重複位元組組成。 - ipad 是 64 個位元組的內部填補,由值為
0x36的重複位元組組成。
工作階段隨機值和訊息隨機值
為防範重送攻擊,供應商必須確保隨機值不會重複。由於在供應商和搜尋者之間維持時鐘或計數器同步處理並不容易,因此供應商會產生工作階段 Nonce (每個連線),並在連線期間與所有訊息共用,而搜尋者會產生訊息 Nonce (每個訊息),並為每個訊息隨機產生。產生每則訊息的 MAC 時,使用的隨機值是工作階段隨機值和訊息隨機值的組合,也就是 concat(session_nonce, message_nonce)。
我們在裝置資訊事件群組中新增工作階段隨機值:
| 訊息群組名稱 | 值 |
|---|---|
| 裝置資訊事件 | 0x03 |
| 訊息產品代號 | 值 |
|---|---|
| 工作階段隨機值 | 0x0A |
當 Message Stream 連線時,應產生工作階段隨機數並傳送給 Seeker:
| 八位元 | 資料類型 | 說明 | 值 |
|---|---|---|---|
| 0 | uint8 | 裝置資訊事件 | 0x03 |
| 1 | uint8 | 工作階段隨機值 | 0x0A |
| 2 - 3 | uint16 | 額外資料長度 | 0x0008 |
| 4 - 11 | 工作階段隨機值 | 因人而異 |
如要在需要 MAC 時傳送訊息,Seeker 會連同訊息一併傳送訊息隨機數和 MAC。
| 八位元 | 資料類型 | 說明 | 值 |
|---|---|---|---|
| 0 | uint8 | 訊息群組 | 因人而異 |
| 1 | uint8 | 訊息代碼 | 因人而異 |
| 2 - 3 | uint16 | 額外資料長度(額外資料長度 + 16) | 因人而異 |
| 4 - n | 額外資料 | 因人而異 | |
| n + 1 - n + 8 | 訊息隨機數 | 因人而異 | |
| n + 9 - n + 16 | 訊息驗證碼 | 因人而異 |
驗證 MAC (訊息驗證碼)
收到含有訊息驗證碼的訊息後,供應商應使用與產生函式相同的函式驗證該訊息。也就是說,收到的 MAC 應等於
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
其中:
- K 由
concat(account key, 48-byte ZEROs)產生,且供應商應遍歷所有儲存的帳戶金鑰,以驗證 MAC。 - message 是 Message 串流的額外資料 (不含訊息隨機數和 MAC)。
如果 MAC 正確,供應商應按照訊息中的指示操作。否則,供應商應傳送 NAK,並說明錯誤原因 (0x3 - not allowed due to incorrect message authentication code)。