訊息驗證碼
訊息串流可用來設定音訊自動切換,請參閱「音訊自動切換訊息」。針對這些重要設定,供應商必須確保訊息是由 GMSCore (快速配對模組) 傳送,而不是探索工具上的任何其他應用程式。
產生 MAC (訊息驗證碼)
FP Seeker 使用 HMAC-SHA256 為裝置設定訊息新增訊息驗證碼。訊息的 MAC 包含前 8 個位元組:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
媒介
- K 是由 concat(帳戶金鑰,48 位元組 ZEROs) 產生。
- message 是訊息串的額外資料。
- nonce 是由 concat(session_nonce, message_nonce);session Nonce 和訊息 Nonce 會在下一節中定義。
- opad 是外部邊框間距的 64 個位元組,由重複位元組的值
0x5C
組成。 - ipad 是內部邊框間距 64 個位元組,由重複位元組的值
0x36
組成。
工作階段 Nonce 和訊息 Nonce
為防止重播攻擊,提供者必須確保 Nonce 並未重複。由於在供應器和 Seeker 上維持時鐘或計數器的同步處理作業並不簡單,因此供應器會產生工作階段 Nonce (每次連線),此這項資訊會與連線期間的所有訊息共用,而 Seeker 則會產生每則訊息的訊息 Nonce (每次訊息),系統會隨機產生每則訊息。產生每則訊息 MAC 的 Nonce 是工作階段 Nonce 和訊息 Nonce 的組合,即 concat(session_nonce, message_nonce)。
我們會在裝置資訊事件群組中加入工作階段 Nonce:
訊息群組名稱 | 值 |
---|---|
裝置資訊事件 | 0 x 3 |
訊息代碼名稱 | 值 |
---|---|
工作階段 Nonce | 0x0A |
當 RFCOMM 連線時,應產生工作階段 Nonce,並傳送至 Seeker:
八位元 | 資料類型 | 說明 | 值 |
---|---|---|---|
0 | uint8 | 裝置資訊事件 | 0 x 3 |
1 | uint8 | 工作階段 Nonce | 0x0A |
2 - 3 | uint16 | 額外資料長度 | 0x0008 |
4 - 11 則 | 工作階段 Nonce | 各有不同 |
為了在需要 MAC 時傳送訊息, Seeker 會傳送訊息 Nonce 和 MAC 以及訊息。
八位元 | 資料類型 | 說明 | 值 |
---|---|---|---|
0 | uint8 | 訊息群組 | 各有不同 |
1 | uint8 | 訊息代碼 | 各有不同 |
2 - 3 | uint16 | 其他資料長度(額外資料長度 + 16) | 各有不同 |
4 - N | 額外資料 | 各有不同 | |
n + 1 - n + 8 | 訊息 Nonce | 各有不同 | |
n + 9 - n + 16 | 訊息驗證碼 | 各有不同 |
驗證 MAC (訊息驗證碼)
收到附有訊息驗證碼的訊息後,供應商應使用與產生函式相同的函式進行驗證。也就是說,收到的 MAC 應等於前 8 個位元組
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
其中:
- K 由
concat(account key, 48-byte ZEROs)
產生,供應商必須掃遍所有儲存的帳戶金鑰,驗證 MAC。 - message 是訊息串流的其他資料 (不包括訊息 Nonce 和 MAC)。
如果 MAC 正確,提供者應遵循訊息中的指示操作。反之,供應商應傳送錯誤原因為 0x3 - 因訊息驗證碼不正確而不允許的 NAK。