蓝牙核心规范-快速入门

一、蓝牙架构

蓝牙分为BR/EDR和BLE两个标准,前者被称为传统蓝牙,后者则为低功耗蓝牙,其中BLE是在蓝牙4.0中添加的,但这并不意味着蓝牙4.0就等于BLE,而是蓝牙4.0之后,设备可以支持蓝牙双栈。蓝牙拥有类似于OSI参考模型的架构,但是由于其自身特点,还是有些不同。

1. 蓝牙基本协议

物理层:蓝牙使用2.4GHz——2.480GHz作为无线的信道。为了避免出现WLAN中信道冲突的情况,蓝牙会在40个2.4GHz频道之间进行跳频,但是在BLE配对时,只会使用2.402GHz(Band 37)、2.426GHz(Band 38)和2.480GHz(Band 39)这三个信道进行,对于BR/EDR,这个数据还有待补充。

链路管理协议(Link Management Protocol, LMP):LMP是蓝牙的数据链路层,LMP是Bluetooth SIG强制要求实现的协议之一,在真正的蓝牙设备上,LMP是在芯片中实现的,就好像FullMAC模式下的WLAN芯片一样。在2019年的35C3会议上,seemoo-lab展示了internalblue项目,使得我们可以通过Broadcom和Cypress的蓝牙芯片固件接口发送LMP报文。

主机控制器接口(Host Controller Interface, HCI):HCI是操作系统和蓝牙芯片的通信协议接口,是Bluetooth SIG的可选标准,但主流的操作系统都是通过HCI来控制蓝牙设备的(至少开源的Linux和Android是这样)。在Android中可以在开发者选项里打开蓝牙HCI日志记录,就可以查看Android系统的HCI交互报文。

逻辑链路控制和适配接口(Logical Link Control and Adaptation Protocol, L2CAP):L2CAP是Bluetooth SIG强制要求实现的协议之一,有点类似于TCP/IP协议中的网络层协议,但是存在端口的概念,L2CAP的端口只绑定不同的蓝牙Profile,而不是系统的不同进程。

射频通讯(Radio Frequency Communication, RFCOMM):RFCOMM是Bluetooth SIG的可选标准,也是类似于L2CAP一样存在端口,但是端口数量不如L2CAP那样多,具体和L2CAP的区别还有待补充。

服务发现协议(Service Discovery Protocol, SDP):SDP是用来发现L2CAP和RFCOMM上面各个端口服务的Profile,客户端可以通过SDP协议,获取服务器侧开放的L2CAP和RFCOMM端口,以及这些端口所绑定的Profile类型,SDP是Bluetooth SIG强制要求实现的协议之一。

2. 蓝牙配置文件

AT命令(AT Commands):AT命令是用于和基带通信的方法,蓝牙也允许通过AT来使得远程蓝牙设备和本机的基带进行交互,为Bluetooth SIG可选标准。

高级音频分发配置文件(Advanced Audio Distribution Profile, A2DP):A2DP可用来实现蓝牙耳机媒体音频播放,为Bluetooth SIG可选标准。

免提配置文件(Handset-Free Profile, HFP):HFP可用来实现蓝牙耳机的通话音频播放,为Bluetooth SIG可选标准。

属性配置文件(Attribute Profile, ATT):ATT是BLE中使用的Profile,可以通过简单的属性读写和通知来传输数据,无需定义复杂的Profile,为Bluetooth SIG可选标准。

通用属性配置文件(Generic Attribute Profile, GATT):GATT是对ATT的标准化,定义了Service, Characteristic等概念,为Bluetooth SIG可选标准。

还有一些配置文件是引进的其它协议的,下面举几个例子:

点对点协议(Point-to-Point Protocol, PPP)
TCP/UDP/IP
对象交换协议(Object Exchange Protocol, OBEX)
vCard/vCal
人机界面设备(Human Interface Device, HID)

二、蓝牙状态

1. 蓝牙状态定义

蓝牙连接:两个蓝牙设备建立了非加密的蓝牙物理连接,但不对传输的机密性做任何保证

蓝牙配对:在建立了非加密连接后,两个蓝牙设备通过配对方法生成了链路加密密钥,从而建立了加密连接。在连接结束后,链路加密密钥会被丢弃,所以对于每一次加密传输,都需要重新配对

蓝牙绑定:在建立了加密连接后,两个蓝牙设备通过密钥分发过程生成了身份解析密钥(Identity Resolving Key, IRK),并将IRK缓存起来。在连接结束后IRK不会被丢弃,所以对于下一次加密传输,不需要重新执行配对和绑定。

对于有一些协议,是可以在不进行配对的情况下传输的,例如服务发现协议(SDP),大部分协议都需要首先进行配对才能完成,而对绑定没有特殊的要求,除非某些基于蓝牙的信任关系的协议,会对绑定状态做判断(例如Google Smart Lock或者Windows Dynamic Lock)。

2. 蓝牙连接

蓝牙连接是建立物理链路的过程,双方需要进行扫描、连接请求、特性交换、最大帧长度协商、蓝牙版本协商、连接参数更新和频段更新的过程。在这个过程结束后,两个蓝牙设备就正式建立了连接,但这时候连接是不加密的。

3. 蓝牙配对

在蓝牙非加密连接建立后,可由一方发起配对请求,从而进入蓝牙配对流程,配对流程由安全管理器(Security Manager, SM)完成。第一步是协商配对方法,BR/EDR的配对方法有

BR/EDR Legacy Pairing:蓝牙2.0引入,只保护机密性,不保护完整性

Secure Simple Pairing:蓝牙2.1引入,对Legacy Pairing进行了增强,使用链路密钥(Link Key)加密通信链路

BR/EDR Secure Connections:蓝牙4.1引入,能保护机密性和完整性,使用长期密钥(LTK)加密通信链路

BLE的配对方法有

LE Legacy Pairing:蓝牙4.0引入,和Secure Simple Pairing比较类似,使用短期密钥(STK)加密通信链路

LE Secure Connections:蓝牙4.2引入,将BR/EDR Secure Connections移植到了BLE上,同样使用长期密钥(LTK)加密通信链路

值得注意的是,在蓝牙配对流程的Pairing Request和Pairing Response报文中,只有双方都将其中的Secure Connections(SC)标志位设置为1的时候,最终才会使用Secure Connections,否则就会回退到旧版配对机制。由于蓝牙4.0的设备大量存在,所以目前针对Secure Connections的降级攻击是较常见的一个威胁。

4. 蓝牙绑定

在蓝牙配对流程的Pairing Request和Pairing Response报文中,可以设置Bonding Flags(BF)标志位为01,这样双方就会存储上述用于加密链路的密钥(Link Key, STK, LTK)并通过密钥分发生成IRK以备未来使用。

生成IRK就意味着在双方之间创建了永久安全性,直到用户取消绑定删除IRK为止。显然必须要在配对之后才能执行绑定。

三、Linux蓝牙实现——BlueZ

四、Android蓝牙实现——BlueDroid

五、iOS蓝牙实现——CoreBluetooth

本文转自:小路小站,转载此文目的在于传递更多信息,版权归原作者所有。

最新文章