Legacy pairing 從名字上看可以知道它是老式設備采用的配對方法。
配對的最終目的是為了生成key,key可以給鏈路加密,保證雙方設備通信的安全性。那配對流程的講述其實就是key的生成過程。
key的生成是經過各種各樣的算法,這里不會針對具體的算法講述,而是着重描述其流程,以及key生成過程中的邏輯推理。
Legacy pairing 的流程可以分為如下的幾個階段:
- 隨機數的生成
- key的選擇以及生成。
- key的驗證
下面先看一下 legacy pair 最終建立鏈路的流程圖:
上圖中對應pair的1,2,3階段標出如圖示。
首先大概描述一下 整個的流程:
- controller端會和對端的設備進行LMP feature exchange 的交互—>
- 交互之后確定配對算法legacy pairing(之前未配對過情況。如果host端有key,那么先走authentication流程,該流程若失敗繼續走legacy pairing)—>
- controller端向host請求pin code
- controller 獲得了pin code之后生成隨機數發送給對方。
- 對端也進行pin code 的請求,並生成相應的隨機數發送給對方。(這里描述的是可以配對的情況,不可配對場景后面會描述)
- 雙方發送 key給對方,並生成最終的link key
- 進行authentication的操作
- 通知各自的host :link key 已經生成。
下面詳細描述一下 Legacy pairing 的流程的各個階段所做的具體的事情。
首先看看隨機數的生成:
這里涉及到一個問題:什么樣的雙方是可以配對的?
主要有如下的幾種場景:
1.responder 有一個可變的pin,這種情況可以配對,其隨機數交互的流程如下:
上面的 legacy pair 最終建立鏈路的流程圖就是屬於這種情況,當initiator發送random給responder的時候,responder回復LMP accepted
2.responder 有一個固定的pin,這種情況也可以配對,其隨機數交互的流程如下:
在這種情況下,雙方使用的隨機是responder 發送過來的隨機數。
3.雙方有一個固定的pin ,那這種情況雙方是無法配對的。其交互流程如下:
上面講的這個隨機數是干嘛的呢?
它是雙方設備計算Kinit 用的,這個Kinit 最后又會被用來計算link key。下面先看看這個Kinit的計算:如下圖:
使用的算法是E2 其中 L‘ = pin 的長度 ,這里的RAND就是上面交互的隨機數,pin的話 老式機器一般都是4個0,那么從上圖可以推出雙方的Kinit應該是一樣。
接下里看第二階段:key的選擇以及生成。
關於key的選擇,這里存在兩種key:unit key和comb key ,那么兩種key 對應於什么樣的應用場景呢?
1.如果其中有一方使用unit key,那么雙方就使用unit key作為link key。
2,如果雙方都給對方發送unit key,那么使用master的unit key作為link key。
3.如果雙方都發送LMP_comb_key,那么雙方就使用他們兩者的key經過計算得到的key。
關於最終key的使用,其互相交互的流程如下:
接下來先看一下 key生成的大局流程圖:
由於前面的分析,現在看到這個圖應該也不難理解的,可以發現之前的隨機數是用來計算Kinit,Kinit又會被用來計算link key。
那下面就來分析一下,Kinit是 如何經過計算出link key。
首先來看看 unit key 是如何計算出來的
key的計算如下所示:
上面生成K之后,用下圖的算法和對方交換key
關於上圖中的藍牙地址也是雙方根據pin code預先設定好的,下面的圖是key的交換的過程。
下面再看看 combination key 的生成
這里需要解釋 是K,當處於未配對狀態,這個K = Kinit,其余的流程 上圖已經明顯,最后可以知道KAB = KBA
到這里key的生成已經完成。
最后是一步key的驗證:
關於key的驗證,其套路還是不變的。主要就是通過交換隨機值以及通過隨機值和link key以及其他共享信息計算出來的值 ,來互相驗證。
其流程如下圖:
這里需要注意的就是,上圖只是展示單方面的驗證,驗證過程是雙向的。
另外注意的是這里的隨機不是上面的隨機值了,可以發現其名字不一樣了,這個隨機值是在authentication 的過程中重新生成的。
相關的air log如下:
從上面的log 可以看出 其驗證是雙向的.
到此關於key的驗證就結束了.
一般情況還會有一個encryption的流程,其實這個流程是不屬於配對流程的,並且在ssp 流程中已經有描述,這里不再描述.