上一章介绍了配对流程的第二阶段,剖析了配对第二阶段的配对算法的选择和鉴权方式的选择。接下来就进入了ble配对的阶段三,在该阶段双方会根据生成的STK或LTK来生成其他的密钥,就是配对的密钥分配阶段。
1. 配对整体流程
下面再回顾下整个配对流程框架:
配对是为了建立密钥,密钥用来加密连接,发布密钥是为了共享密钥,用于加密重新连接、验证签名和随机地址解析,上图是蓝牙配对的整个流程图。
配对有三个阶段,两个阶段是必须使用的,第三阶段可选:
阶段一:Pairing Feature Exchange 交换配对特性
阶段二:(LE legacy pairing): Short Term Key (STK) Generation 传统配对方式,生成STK
阶段二:(LE Secure Connections): Long Term Key (LTK) Generation 安全配对方式, 生成LTK
阶段三:Transport Specific Key Distribution 发布密钥
本章我们主要来讲解配对的阶段三,该阶段主要是分配相关的密钥,并且将其存储在数据表中,该阶段又称为绑定。 根据阶段二中配对方式的legacy pairing 和 secure pairing,阶段三中密钥的生成和下发也会有些不同。
2. 密钥生成
在该阶段会根据阶段二中的STK和LTk来生成用于不同功能的其他密钥,例如IRK,CSRK,LTK,EDIV, Rand等。
- Identity Resolving Key (IRK) : 一个128-bit key 用于生成和解析随机地址的。
- Connection Signature Resolving Key (CSRK) : 128-bit key 用于对数据签名和认证的
- Long Term Key (LTK) : 128-bit key 用于生成链路层加密数据的session key。session key的生成这部分是在LL层生成的,control端的安全暂时不在本章节介绍。
- Encrypted Diversifier (EDIV) :一个16bit的数值,用来识别LTK密钥的, 这个是用在legacy pairing中的,每次生成LTK,该数值都会重新分配。
- Random Number (Rand) : 一个64bit的数值,用来识别LTK密钥的, 这个是用在legacy pairing中的, 每次生成LTK,该数值都会重新分配 。
2.1 生成IRK
IRK是用来生成和解析私有地址的。 主机通过IRK解析从机的私有地址,从机也通过IRK来解析主机的私有地址。
2.2 生成CSRK
CSRK是用来对数据进行签名的,一个设备接收到CSRK后就可以对设备进行验证。
2.3 生成LTK, EDIV 和 Rand
当Slave要和之前配对过的Master设备进行连接的加密,EDIV和Rand此时可以被Slave用来建立之前共享的LTK。每分发一次LTK, EDIV, Rand,它们都要被重新生成一次。Slave可以在Security database中映射好LTK, EDIV和Rand,以便和LTK快速对应起来。
另外Master也可以分发LTK, EDIV和Rand,这样在Role Switch之后便于快速重连。
2.4 生成LinkKey (经典蓝牙)
配对过程还可以生成LinkKey,LinkKey是用来给经典蓝牙进行加密的。通过这个可以将BLE配对产生的配对密钥转化成经典蓝牙的密钥。生成算法如下:
如果至少有一端设置 CT2 = 0 则:
ILK = h6(LTK, “tmp1”)
BR/EDR link key = h6(ILK, “lebr”)
如果两端的CT2都设置为1,则:
ILK = h7(SALT, LTK)
BR/EDR link key = h6(ILK, “lebr”)
3. 密钥下发
3.1 legacy pairing 密钥下发
- LTK, EDIV, and Rand
- IRK
- CSRK
在上述这些key下发之前,连接需要是用STK来加密
3.2 secure pairing 密钥下发
- IRK
- CSRK
在存储加密key信息时,会交互设备的MAC地址,一旦MAC地址的设备在配对后连接上了设备。 设备就会把MAC地址和对应的密钥一起存储在数据表中。
整体密钥传输和下发流程如下:
## 4. Slave Security Request
从机端可能发送一条Security Request 命令给主机端,当主机接收到该命令后可能加密链路,初始化配对流程,或者拒绝该请求。
如果在配对流程正在进行的时候,从机端是不应该发送Security Request 命令的。
主机端收到Security Request数据包后,如果主机端之前已经发送过Pairing Request命令给从极端,并且从机端没有回复, 或者主机端已经初始化了加密流程。则主机端会直接忽略从机发送的Security Request命令。
而如果主机不支持配对功能,则主机也会直接返回失败。
在主机收到Security Request命令后,主机会检查自己的数据包中是否有该设备的加密信息。如果数据表中没有加密信息,则重新启动配对流程。如果数据表中已经有了加密信息,则更新加密信息。
具体的流程如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7cPuiaCV-1659841629993)(./Security_Request.png)]
该功能由从机端主动发起一个安全配对请求,从而实现由从机端来决定何时进入配对,或者更新配对密钥。
具体的流程如下图:
该功能由从机端主动发起一个安全配对请求,从而实现由从机端来决定何时进入配对,或者更新配对密钥。