訊息驗證碼

訊息串流用於設定音訊自動切換,請參閱「音訊自動切換訊息」。對於這些重要設定,供應商必須確保訊息是由 GMSCore (快速配對模組) 傳送,而不是由 Seeker 上的任何其他應用程式傳送。

產生 MAC (訊息驗證碼)

FP Seeker 會使用 HMAC-SHA256,為裝置設定訊息新增訊息驗證碼。訊息的 MAC 包含前 8 個位元組:

 sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))

媒介

  1. K 是由 concat(帳戶金鑰、48 位元組的零) 產生。
  2. message 是 Message 串流的額外資料。
  3. nonce 是由 concat(session_nonce, message_nonce) 產生;session nonce 和 message nonce 的定義請見下節。
  4. opad 是 64 個位元組的外部填充,由值為 0x5C 的重複位元組組成。
  5. 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)))))

其中:

  1. Kconcat(account key, 48-byte ZEROs) 產生,且供應商應遍歷所有儲存的帳戶金鑰,以驗證 MAC。
  2. message 是 Message 串流的額外資料 (不含訊息隨機數和 MAC)。

如果 MAC 正確,供應商應按照訊息中的指示操作。否則,供應商應傳送 NAK,並說明錯誤原因 (0x3 - not allowed due to incorrect message authentication code)。