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 流程中已经有描述,这里再也不描述.