一文让你理解蓝牙安全管理协议SMP,附带视频

 零.声明

本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

第二篇: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)。

-------------------------------------------------------------------------------------------------------------------------

蓝牙视频教程(跟韦东山老师合作):

https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.20.5aeb41f98e267j&id=693788592796

其中SMP在专题19,目录如下:

蓝牙交流扣扣群:765961169

Github代码:GitHub - sj15712795029/bluetooth_stack: 这是一个开源的双模蓝牙协议栈(bluetooth.stack)(btstack),可以运行在STM32,Linux.,包含HCI,L2CAP,SDP,RFCOMM,HFP,SPP,A2DP,AVRCP,AVDTP,AVCTP,OBEX,PBAP等协议,后续会继续维护,以达到商用的目的

入手开发板:https://shop220811498.taobao.com/category-1542116976.htm?spm=a1z10.5-c-s.w4010-22329603913.7.39ca7dbe2EA0K3&search=y&catName=%C0%B6%D1%C0%BF%AA%B7%A2%B0%E5#bd

蓝牙学习目录一篇文章足够你学习蓝牙技术,提供史上最全的蓝牙技术(传统蓝牙/低功耗蓝牙)文章总结,文档下载总结(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 BandOOB)鉴权数据密钥长度和 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 BandOOB)鉴权数据来进行鉴权配对?

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 workTK=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 entryTK是用户输入的值!这个passkey entry20bit的值,For example, if the user entered passkey is ‘019655’ then TK shall be0x00000000000000000000000000004CC7.

2.2.4. OOB

流程图如下:

这个就是Legacy pairing OOB的流程,跟我们2.2.2介绍的流程一样,你可以结合我们的描述来看这种图示,就一目了然了,需要重点强调的是:OOBTKOOB的值。

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

整个的流程流程图如图所示:

步骤1Central主动发送通过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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wireless_Link

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值