Legacy pairing 從名字上看能夠知道它是老式設備採用的配對方法。算法
配對的最終目的是爲了生成key,key能夠給鏈路加密,保證雙方設備通訊的安全性。那配對流程的講述其實就是key的生成過程。api
key的生成是通過各類各樣的算法,這裏不會針對具體的算法講述,而是着重描述其流程,以及key生成過程當中的邏輯推理。安全
Legacy pairing 的流程能夠分爲以下的幾個階段:dom
下面先看一下 legacy pair 最終創建鏈路的流程圖:加密
上圖中對應pair的1,2,3階段標出如圖示。code
首先大概描述一下 整個的流程:it
下面詳細描述一下 Legacy pairing 的流程的各個階段所作的具體的事情。io
這裏涉及到一個問題:什麼樣的雙方是能夠配對的?ast
主要有以下的幾種場景:class
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: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。
key的計算以下所示:
上面生成K以後,用下圖的算法和對方交換key
關於上圖中的藍牙地址也是雙方根據pin code預先設定好的,下面的圖是key的交換的過程。
這裏須要解釋 是K,當處於未配對狀態,這個K = Kinit,其他的流程 上圖已經明顯,最後能夠知道KAB = KBA
到這裏key的生成已經完成。
最後是一步key的驗證:
關於key的驗證,其套路仍是不變的。主要就是經過交換隨機值以及經過隨機值和link key以及其餘共享信息計算出來的值 ,來互相驗證。
其流程以下圖:
這裏須要注意的就是,上圖只是展現單方面的驗證,驗證過程是雙向的。
另外注意的是這裏的隨機不是上面的隨機值了,能夠發現其名字不同了,這個隨機值是在authentication 的過程當中從新生成的。
相關的air log以下:
從上面的log 能夠看出 其驗證是雙向的.
到此關於key的驗證就結束了.
通常狀況還會有一個encryption的流程,其實這個流程是不屬於配對流程的,而且在ssp 流程中已經有描述,這裏再也不描述.