標籤:
一.序:
平時總是搞藍芽協議,所以總是對RF,BB,LMP比較感興趣,可能比較神秘,閑話不多說,直奔主題
二.LMP
訊息用於建立鏈路、加密和控制,是屬於ACL-C層次的,比ACL-U優先順序較高,並且不會轉寄到更高層次,只是在晶片內處理
PDU格式如所示:
每個PDU的payload size要求不同
三.配對過程:
1.匹配
當兩台裝置無共用連結字時,則基於PIN和隨機數建立初始化鍵Kinit。在驗證器向要求者發出LMP_in_rand時建立Kinit鍵。如何建立鍵請參閱基帶
規範。然後進行認證, 其計算過程基於Kinit鍵, 而非連結字。通過認證後,連結字即被建立(就是我們平時說的link key)。流程:
2.建立連結字
連結字用於兩裝置間的所有後續串連的認證,直到該連結字改變為止。匹配過程中建立的連結字可以是按鍵組合,或者是一個單元的單元鍵。以下規則用於連結字的選擇:
* 如果一單元發送 LMP_unit_key,另一個單元發送 LMP_comb_key,那麼該單元鍵即為連結字;
* 如果兩單元都發送 LMP_unit_key,那麼主單元鍵即為連結字;
* 如果兩個單元都發送 LMP_comb_key,連結字將按基帶規範所述過程進行計算。
LMP_unit_key 的內容是單元鍵與Kinit進行XOR操作的結果值。
LMP_comb_key 的內容是LK_RAND與Kinit進行XOR操作的結果值。任何配置為使用按鍵組合的裝置都將該連結字儲存在固定儲存空間中。
建立連結字流程如下:
3.認證
認證過程基於競爭接聽模式(參見基帶規範)。驗證器發送一個LMP_au_rand PDU 給要求者,該 PDU 分組含一個隨機數(或競爭碼)。請求
者計算出應答值,該應答是競爭碼、要求者 BD_ADDR 和保密字的函數。然後將應答發回驗證器驗證應答是否正確。
計算應答值的過程參閱基帶規範。認證應答的正確計算需要兩裝置共用同一保密字。主單元和從單元都可作為驗證器。以下協議資料單元可用於認證過程
此時分兩種情況
1)要求者具有連結字
如果要求者具有與驗證器關聯的連結字,則要求者計算出應答值並連帶 LMP_ sres 發送到驗證器,由驗證器檢查其應答值。如果應答值不正確,
驗證器則發送附加原因碼 authentication failure 的 LMP_ detach 終止
2)要求者無連結字
如果要求者沒有與驗證器關聯的串連鍵,在 LMP_ au_rand 收到後,要求者則發送附加原因碼 key missing 的 LMP_not_accepted 訊息。
最後附上雙方帶有連結字的鑒權認證流程圖:
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*華麗分割線:串連為類比LMP的代碼,問題很多,就三天寫的·不為別的,大概思路是類比下LMP,配對流程沒寫
*串連:LMP 類比源碼
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
藍芽LMP剖析(一)