在蓝牙核心规范中,有三个主要的架构层:Controller、Host和Application。在Host层,有一个名为Security Manager (SM)的模块(如下图以Nordic协议架构所示红色标注的位置),它定义了配对和密钥分发的方法和协议、相应的安全toolbox,以及定义了配对命令帧格式、帧结构和超时限制的Security Manager协议(SMP)。安全管理器(SM)使用密钥分发方法来执行无线通信中的认证和加密功能。
执行配对以建立密钥,再使用密钥加密链接。然后执行特定于传输的密钥分发来共享密钥。密钥可用于在将来重新连接时加密链接、验证签名数据或执行随机地址解析。一般来说,配对有三个阶段。
- 阶段1: Pairing Feature Exchange
- 阶段2:(LE legacy pairing):短期密钥(STK)生成
- 阶段2:(LE Secure Connections):长期密钥(LTK)生成
- 阶段3:传输指定密钥分发
在这里我们需要搞清楚两个概念:LE legacy pairing和LE Secure Connections。LE是“low energy”的缩写,是蓝牙4.0及以上版本的主要功能之一。在蓝牙4.2规范中,添加了LE物理传输的安全连接特性,升级了对蓝牙LE物理传输的配对,使用了FIPS-approved的算法(AES-CMAC和P-256椭圆曲线)。为了区分蓝牙4.0和4.1规范中定义的安全连接和配对,将其称为LE legacy pairing,而到蓝牙4.2版本后增加了LE Secure Connections的模式。
下图流程LE legacy pairing和LE Secure Connections两个都有包含
在本文中,我们将讨论第1阶段:配对特性交换,其安全特性交换内容,包括输入/输出(IO)功能、中间人保护需求等。
两个设备之间的配对信息交换是通过配对请求和配对响应数据包完成的。下表列出配对请求/响应中显示了这两条消息的内容。
上面表格中各字段内容所代表的意义做详细解释:
IO Cap, “IO Capabilities”
IO指的是输入/输出,将IO功能组合起来生成该字段的值。对于输入功能,可以是“No Input”、“Yes/No”或“Keyboard”,详述如下。
对于输出功能,它可以是“No Output”或“Numeric Output”,详述如下。
将这些输入和输出功能结合起来之后,下面是一个矩阵,定义了蓝牙设备应该具有哪些IO功能。
所有的配对算法都不能使用Yes/No input和No output
从上面的矩阵中,映射相应的IO功能,并选择下面的enum将其放入配对请求/响应数据包中
对应Nordic 的代码ble_gap.h文件中代码片断如下:
OOB DF, “OOB Data Flag”
OOB或Out-of-Band使用外部通信手段来交换配对过程中使用的一些信息。OOB媒介可以是任何其他无线通信标准,可以携带对应的配对信息,如NFC或QRCode。
BF, “Bonding_Flags”
绑定是指配对后交换长期密钥(LTK),并存储这些密钥供以后使用——这是在设备之间创建永久的安全性。
“MITM”
MITM是“Man-In-The-Middle”的缩写。该字段是一个1位标志,如果设备请求MITM保护,则将其设置为1。本文主要讨论配对特性交换的过程——如果您对MITM感兴趣,请参考蓝牙核心规范v4.2, Vol1, Part A, 5.2.3。
“SC”
SC字段是一个1位标志,设置为1以请求LE安全连接配对。可能产生的配对机制是,如果两个设备都支持LE Secure Connections,则使用LE Secure Connections模式,否则使用LE legacy pairing模式。所以这个标志是确定第二阶段配对方法的指示位。
“KC”
keypress字段是一个1位标志,仅在Passkey输入协议中使用,在其他协议中被忽略。密钥输入协议是一种典型的LE legacy pairing和LE Secure Connections的配对方法。我们将在下一篇文章中对此进行讨论。
“Maximum Encryption Key Size”
最大密钥大小应该在7到16字节之间
“Initiator Key Distribution” & “Responder Key Distribution”
“发起者密钥分发”&“响应者密钥分发”
这两个字段的定义如下。我将在以后的系列文章来解释密钥分发。
当配对特性交换开始时,发起者和响应者将通过配对请求和响应相互交换配对特性信息。有了这些信息,发起者和响应者可以相互确定I/O能力,应该使用哪种配对机制(legacy pairing或LE Secure Connections),并选择配对方法(just work、Passkey Entry、Numeric Comparison or Out of Band),以便在phase e2中使用。我们将在下一篇文章中探讨配对的细节:配对方法和密钥生成。
以Nordic 的nRF5 SDK15.3代码为例,关于以上所述的配对特性交互相关代码主要参考 ble_gap.h文件中的ble_gap_sec_params_t 结构体,如下
配对特性参数在main.c文件中的peer_manager_init函数进行设置,如下:
通过Ellisys 抓取手机和nRF52 设备之间的Pairing Feature Exchange数据包如下图所示