零.声明
本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:
第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。
第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等
第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等
第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。
第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)
第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等
第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展
第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。
另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。
-------------------------------------------------------------------------------------------------------------------------
蓝牙视频教程(跟韦东山老师合作):
其中SMP在专题19,目录如下:
蓝牙交流扣扣群:765961169
蓝牙学习目录:一篇文章足够你学习蓝牙技术,提供史上最全的蓝牙技术(传统蓝牙/低功耗蓝牙)文章总结,文档下载总结(2020/12/11更新)_Wireless_Link的博客-CSDN博客_蓝牙eir
--------------------------------------------------------------------------------------------------------------------------
一. SMP概念
SMP(Security Manager Protocol)即安全管理协议。SMP 是蓝牙用来进行安全管理的,其定义了配对和 Key(可以理解成密钥)的分发过程的实现,以及用于实现这些方法的协议和工具。SMP 的内容主要是配对和 Key 的分发,然后用 Key 对链路或数据进行加密。这个 Key 至关重要,怎么生成、怎么由通信的双方共享,关系到加密的成败。因此蓝牙协议定义了一系列的复杂机制,用于处理和加密 Key 有关的操作。SMP 被用在 LE 单模设备或蓝牙双模(BR/EDR/LE)设备中。
LE 设备配对分为 LE 传统配对(LE Legacy Pairing)和 LE 安全连接配对(LE Secure ConnectionPairing)两种方式。
SMP的架构如下:
如上图所示, 安全管理(Security Manager, SM)位于逻辑链路控制和适配协议(Logic LinkControl and Adaption Protocol, L2CAP)之上、通用访问配置文件(Generic Access Profile,GAP)之下。这个图还是不太具体,我们来具体看下SMP在协议栈中的位置,如红框所示:
当然SMP不仅仅用于BLE,也会用在BR/EDR
二. 配对流程
1. 配对整体流程介绍
配对一共分为3个步骤,如下图所示:
● 第 1 阶段是建立连接后双方提配对的安全需求。
● 第 2 阶段是根据安全需求进行配对,其中传统配对和安全连接配对流程不一样。之后利用产生的 Key 进行链路加密。
● 第 3 阶段是在进行链路加密后,开始各种 Key 的分发。之后双方就可以传送私密信息了。
另外注意的是:第 3 阶段是可选的。在第 3 阶段需要注意的是,LE 传统配对用的是短期 Key 对链路进行加密,加密后主设备(Master)/从设备(Slave)各自分发自己生成的长期 Key。蓝牙协议规范没规定 LE 传统配对的LTK 怎么生成,主设备和从设备各自生成 LTK,值会不一样,故一定需要将 LTK 分发给对方。而对于 LE 安全连接配对,蓝牙协议规范明确规定了 LTK 的生成方法,故双方的 LTK 是一样的,不需要分发。
我们来展开看下,至于具体的流程我们在后续各个小节介绍
下面我们就来详细说明下步骤
2. 配对详细步骤介绍
我们在上个小节说明了配对的三个步骤,这个小节我们就来一一介绍下
备注:这其中会牵扯到很多算法,我们不在2.2中做详细介绍,但是会在后面专门针对各个算法的实现原理来做介绍
2.1. 建立连接后双方提配对的安全需求(第1阶段)
在说明这个我们先来普及一个GAP的角色概念,在GAP的BLE介绍中,发起设备叫做中心设备(Central)当然你也可以叫做master或者叫做连接的Initiator,相应连接的设备叫做外设设备(Peripheral)当然你也可以叫做slave或者连接的Responder!好了,说完这个,我们回归整体
配对第 1 阶段的过程是Central建立连接后以配对请求(Pairing Request)和配对回应(Pairing Response)的交互开始,通过这两个命令,Central和Peripheral可以交换足够的特征(Feature)信息,用于决定在阶段 2 使用哪种配对方法、哪种鉴权方式。交换双方的信息包括输入/输出能力(IO Capabilities)、是否有带外(Out Of Band,OOB)鉴权数据、安全需求和 Key 分发要求。这些交换的特征信息决定了阶段 2 采用的鉴权方式和配对方式。
我们先来看下Central发起配对的流程图
我们再来看下Peripheral请求发起配对的流程图
其中会牵扯到3中封包类型:Security Request/Pairing Request/Pairing Response.我们来说明下各个封包的格式以及其中字段,最后我们说下他是怎么决定出来第二阶段要走什么流程的!
2.1.1. Security Request数据格式
这个封包的主要作用是Peripheral触发Central发起配对请求,数据格式如下:
1byte的PDU Code,Security Request为0x0B
2.1.2. Pairing Request数据格式
这个封包主要是Central发送给Peripherals的配对请求,其中封包格式如下:
我们来挑其中我认为有必要说明的参数详细说下
2.1.3. Pairing Response数据格式
这个是配对响应设备发送给发起者自己的Feature,数据格式为:
2.1.4. 第一阶段部分参数介绍
AuthReq如下图所示:
IO capabilities:
顾名思义,输入输出能力
输入能力有:
输出能力有:
所以综合来说一个设备的输入输出映射为:
OOB flags:
是否需要带外鉴权(NFC/USB等)
2.1.5. 第一阶段决定第二/三阶段的分支
我们在2.2.1中提到交互的数据用于决定在阶段 2 使用哪种配对方法、哪种鉴权方式。交换双方的信息包括输入/输出能力(IOCapabilities)、是否有带外(Out Of Band,OOB)鉴权数据、密钥长度和 Key 分发要求。
下面我们来说下怎么来决定的·
Q1:怎样决定配对方式?
A1:
1) 首先来说下,配对方式有两种: legecy pairing,这个是在蓝牙4.2之
前的SMP配对方式,因为需要把长期密钥LTK分发,所以会有被破解的风险,所以在蓝牙4.2增加了Seurity Connection,这种方式不需要交互LTK(是因为spec已经规定好LTK怎么计算),所以更安全一点
2) 通过Authreq中的SC bit field来决定,双方都支持,那么才会是Security
Connection.
3)如下图所示,只有两个设备同时支持SC后续才会是SC pairing
Q2:是否有带外(Out Of Band,OOB)鉴权数据来进行鉴权配对?
A2:
1) 首先这个OOB是在
1) 这个要区分Legicy pairing还是Security Connection Pairing
2) 如果是Legecy pairing,那么双方都要支持OOB,还走OOB鉴权配对
3) 对于Security Connection Pairing,只要有一方带有OOB,那么就走OOB
鉴权配对,如图所示:
Q3:怎样决定鉴权方式呢?
A3:
1) 首先我们来说下有哪几种:
● 直接工作(Just Work),提供最低级别的安全保护,这种配对在配对发起后不再需要用户参与。因此,这种配对不能提供 MITM 保护。这种方法在 LE 传统配对和LE 安全配对中均有。
● 数值比较(Numeric Comparison),类似于 BR/EDR 中的 Simple pairing。两个设备会随机生成 6 个数字并显示出来,以便用户比较后进行确认。由于配对过程需要用户参与,所以这种配对可以提供 MITM 保护。这种方法只用于 LE 安全连接配对。
● 输入配对码(Passkey Entry),通过输入配对码的方式鉴权,有两种操作方法:用户在两个设备上输入相同的 6 个数字,后续配对过程会进行相应的校验;一个设备(A)随机生成并显示 6 个数字(要求该设备有显示能力),用户记下这个数字,并在另一个设备(B)上输入。设备 B 在输入的同时,会通过安全管理协议将输入的数字同步传输给设备 A,设备 A会校验数字是否正确,以达到鉴权的目的。同样,这种配对方式提供 MITM 保护。这种方法在 LE 传统配对和LE 安全配对中均有。
● 配对的双方在配对过程之外额外地交互一些信息,然后以这些信息为输入,进行后续的配对操作。这些额外信息称作 OOB、OOB 的交互过程由 OOB 协议来规范。
2) 如果Authreq双方都没有MIMT,那么走Just work的方式
3) 如果一方有MIMT,那么要根据双方的IO capabilities来决定哪种方式
4) 举一个例子
可以看到双方都有MIMT,所以要根据双方的IO capabilities来决定方式,通过映射表,映射到这里(我们是SC)
可以看到我们是走的Numberic Comparision的方式,也就是弹出6个数字000000~99999数值的比较!
Q4:怎样决定密钥长度
A4:最大的长度是7~16 Byte,这个最终是取双方的最小值来确定密钥长度
Q5:怎样决定鉴权配对第三阶段分发哪些密钥?
A5:首先Key有以下如图几种:
• 在LE legacy pairing中,EncKey是一个1位字段,设置为1表示设备应使用加密信息命令分发LTK,然后分发EDIV跟Rand用于标识Central识别
在LE安全连接配对中,当SMP在LE传输上运行时,应忽略EncKey字段。
EDIV和Rand应设置为零,且不得分配。
当SMP在BR/EDR传输上运行时,EncKey字段设置为1,以指示设备希望从
BR/EDR链路密钥派生LTK。当启动器和应答器密钥分配/生成字段中的两个
设备都将EncKey设置为1时,应使用从BR/EDR链路密钥计算LTK的程序。
• IdKey是一个1位字段,设置为1,表示设备应使用标识信息命令分发IRK,
用于识别public device/static random address
• SignKey是一个1位字段,设置为1表示设备应使用Signing Information命
令分发CSRK。
• LinkKey是一个1位字段。当SMP在LE传输上运行时,LinkKey字段设置为1,以指示设备希望从LTK派生链路密钥。当发起方和响应方密钥分配/生成字
段中的两个设备都将LinkKey设置为1时,应使用从LTK计算BR/EDR链路密
钥的程序。不支持LE安全连接的设备应将该位设置为零,并在接收时忽略该
位。当SMP在BR/EDR传输上运行时,LinkKey字段保留供将来使用。
后面我们来介绍下具体的分发方式!
2.2. 遗留配对(Legacy pairing)方式(第2阶段)
SMP Legacy pairing有三种方式,分别是:Just work/Passkey Entry/Out of Band,
2.2.1. Legacy pairing整体流程
我们来分别说一下这三种方式,我们先总体介绍下:
此部分建议结合2.2.2.2/2.2.2.3/2.2.2.4对着流程图看!
步骤1:配对发起者生成生成128bit的随机数LP_RAND_I(Legacy Pairing random initiator)
配对发起者根据c1算法生成128bit的LP_CONFIRM_I(Legacy Pairing confirm initiator)
算法公式以及参数如下:
步骤2:配对响应者生成生成128bit的随机数LP_RAND_R(Legacy Pairing random response)
配对发起者根据c1算法生成128bit的LP_CONFIRM_R(Legacy Pairing confirm response)
算法公式以及参数如下:
步骤3:Initiator跟Responser各自算好自己的LP_RAND后,Initiator把LP_RAND_I发送给Response,然后Responser发送LP_RAND_R发送Initiator.
步骤4:Initiator发送LP_RAND_I后,Responser根据LP_RAND_I用c1算法算出confirm值跟LP_CONFIRM_I是否匹配,如果不匹配,发送Confirm Value Failed错误码给Initiator,结束当前的配对。如果匹配,那么发送LP_RAND_R给Initiator.
步骤5:Initiator收到Responser发送过来的LP_RAND_R后,通过c1算法计划,看看LP_RAND_R跟LP_CONFIRM_R是否匹配,如果匹配,那么就通过s1算法算出STK,然后来主动发送start encryption HCI comamnd给controller,我们先来看下s1算法,然后再来看下加密的流程!
我们先来看下s1算法
然后我们再来看下加密的过程
2.2.2. Just work
首先我们来看下流程图,然后再针对流程图做细节展开
这个就是Legacy pairing just work的流程,跟我们2.2.2介绍的流程一样,你可以结合我们的描述来看这种图示,就一目了然了,需要重点强调的是:just work的TK=0x00
我们通过一个btsnoop来分析下,流程图如下:
1) 我们来分析下pairing request/response的一些交互信息
可以看到双方都不支持SC,所以默认走Legacy pairing配对方式,并且双方都没有OOB,并且Initiator的IO Cap为Keyboard Display,Responser的IO Cap为No Input No Output,所以我们对下映射表为Just work的方式
2) 后续就是按照我们的流程图c1,s1算法生成STK
3) 加密用STK
2.2.3. Passkey Entry
流程图如下:
这个就是Legacy pairing passkey entry的流程,跟我们2.2.2介绍的流程一样,你可以结合我们的描述来看这种图示,就一目了然了,需要重点强调的是:passkey entry的TK是用户输入的值!这个passkey entry是20bit的值,For example, if the user entered passkey is ‘019655’ then TK shall be0x00000000000000000000000000004CC7.
2.2.4. OOB
流程图如下:
这个就是Legacy pairing OOB的流程,跟我们2.2.2介绍的流程一样,你可以结合我们的描述来看这种图示,就一目了然了,需要重点强调的是:OOB的TK是OOB的值。
2.2.5. Legacy Pairing使用到的数据格式
Legacy Pairing主要用到两种SMP PDU:Pairing Confirm/Pairing Random,我们分别介绍下
2.3. 安全连接配对(Security Connection)(第2阶段)
安全连接配对的流程如下:
首先在配对的第一阶段确定是SC pairing后,然后开始交互public key exchange,然后根据三种不同的方式走不同的流程(Just work or nuumber comparison/Passkey Entry/Out of Band)!
下面我们就针对不同的每个流程来介绍下SC pairing,这三种方式的阶段被成为Authentication 1,然后最终再计划long term key,这个阶段被成为Authentication 2
2.3.1. Public key exchange
整个的流程流程图如图所示:
步骤1:Central主动发送通过Pairing Public Key SMP PDU发送public key(Initiator叫做PKa)给Peripheral,然后Peripheral通过Pairing Public Key(Response叫做PKb)回送public key给Central.
public key可以通过controller实现,也可以通过host软件算法实现,我们来分别介绍下:
通过controller实现:直接发送LE Read Local P-256 Public Key Command(OGF=0x08,OCF=0x25),
直接读取到public key,发送给对方就行了。
步骤2:通过PKa,PKb生成DHKEY,这个同样可以用controller实现,也可以用host软件算法实现。
通过controller实现:直接发送LE Generate DHKey command,就可以得到dhkey
2.3.2. Just work/Number comparison(Authentication stage 1)
Just work或者number comparison的流程图如下:
我们来展开下交互流程图:
在public key exchange后,我们一共经历了几个步骤:
步骤1:双方各自生成一个随机数(Initiator生成的随机数叫做Na,Responser生成的随机数叫做Nb)
步骤2:双方把ra跟rb设置为0
步骤3: Responser通过算法f4计算出来Cb,然后发送给Initiator
我们来看下stage just works或者Numeric comparision的f4计算公式以及参数
步骤4:Initiator把随机数发送给Responser,Responser把随机数发送给Initiator。
步骤5:Initiator在通过f4算法根据public key以及Responser发送过来的随机数计划是否匹配,如果不匹配则结束,返回这个错误码(confirm check failure)。
步骤6:双方通过public key以及随机数通过算法g2计算出6位数字(000000~999999)显示
我们来看下g2的计算公示以及参数
2.3.3. passkey entry(Authentication stage 1)
Passkey Entry流程图如下:
我们来展开下:
2.3.4. oob(Authentication stage 1)
2.3.5. DHKey check(Authentication stage 2)
详细步骤如下:
我们再Public key exchange后算出来了DHKey,然后经过以下步骤:
步骤1:双方各自通过f5算法算出来LTK以及MacKey
其中f5的算法公式以及参数如下:
步骤2:Initiator根据f6算法计划出来EA
其中f6算法以及参数如下:
步骤3: Responser根据f6算法计划出来EA
其中f6算法以及参数如下:
步骤4: Initiator发送Ea(DHKey check)给Responser,Responser通过f6计算是否匹配
步骤5:Responser发送Eb(DHKey check)给Initiator,Initiator通过f6计算是否匹配
2.3.6. 加密
2.4. 分发各种Key(第3阶段)
使用LE legacy配对时,可以将以下密钥从外围设备分发到中央设备:
• 使用加密信息命令的LTK
• 使用中央标识命令的EDIV和Rand
• 使用标识信息命令的IRK
• 使用标识地址信息命令的公共设备或静态随机地址
• CSRK使用签名信息命令
当使用LE安全连接时,可将以下密钥从外围设备分发到中央设备:
• 使用标识信息命令的IRK
• 使用标识地址信息命令的公共设备或静态随机地址
• CSRK使用签名信息命令
使用LE legacy配对时,中央可向外围设备分发以下密钥:
• 使用加密信息命令的LTK
• 使用中央标识命令的EDIV和Rand
• 使用标识信息命令的IRK
• 使用标识地址信息命令的公共设备或静态随机地址
• CSRK使用签名信息命令
当使用LE安全连接时,中央可向外围设备分发以下密钥:
• 使用标识信息命令的IRK
• 使用标识地址信息命令的公共设备或静态随机地址
• CSRK使用签名信息命令
使用LE遗留配对时,钥匙应按以下顺序分配:
1) LTK by the Peripheral
2) EDIV and Rand by the Peripheral
3)IRK by the Peripheral
4)BD_ADDR by the Peripheral
5)CSRK by the Peripheral
6)LTK by the Central
7)EDIV and Rand by the Central
8)IRK by the Central
9)BD_ADDR by the Central
10)CSRK by the Central
当使用LE安全连接时,钥匙应按以下顺序分配:
1) IRK by the Peripheral
2) BD_ADDR by the Peripheral
3) CSRK by the Peripheral
4) IRK by the Central
5) BD_ADDR by the Central
6) CSRK by the Central