ble笔记_SMP

2023-10-07 14:20
文章标签 笔记 ble smp

本文主要是介绍ble笔记_SMP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一直对配对绑定充满好奇,于是我抓了一次完整的包,对着协议解析了一次。不算深入理解,只是知道大概的流程是怎么回事。

/*********************************************************************************/
SM 在BLE协议栈的位置:
在这里插入图片描述

介绍:
安全管理。每个设备生成并分配其生成的密钥。设备之间进行相互配对,连接一段加密,设备必须分配用于加密,保障隐私并对消息进行验证的密钥。当设备把配对的密钥在flash保存下来,设备就处于绑定状态。之后两个设备第二次重连时安全启动会更快,不需要像第一次一样再启动整个配对过程。

配对:两端蓝牙设备加密特性的交换,并创建临时密钥。之后连接用临时密钥加密,提高了蓝牙交互的安全性。

绑定:在配对之后交换和保存长期密钥,用于之后的连接。如果一个手环已经和手机绑定,他们可以不必再配对就可以加密重连,手机仅仅需要请手环“开启加密”,双方就可以使用已经存储的加密密钥通讯。

绑定对于配对来说是个可选配置,有绑定则下次重连不需要再配对,没有绑定,则每次重连都需要配对。

配对流程:
在这里插入图片描述

配对有三个阶段:
1.配对信息交换(主要就是两边设备的I/O能力,设置绑定标准,链路是否需要MITM保护,如果设置设置绑定,需要分配那些密钥信息等等);
2.链路认证(比如手机输入的配对密码,动态密码,静态密码之类的,密码认证的过程)
3.密钥分配(绑定可选)

第一阶段:配对信息交换:主要是配对请求和配对响应数据包(当配对开始时,1个设备要发起Pairing Feature Exchange,响应设备如果不支持配对或者配对无法执行,响应设备应响应配对失败的消息,表示不支持配对,否则响应支持配对的消息)
在这里插入图片描述

配对请求数据包格式:
在这里插入图片描述

抓包数据分析:(手机->设备)(附录1:WireShark记录)
在这里插入图片描述

Code:
在这里插入图片描述

IO Capability:(描述了设备的输入和输出能力)
在这里插入图片描述

0x00:设备具有只有显示功能
0x01:设备有显示功能,并且至少有两个按键可以表达YES or NO
0x02:设备只有一个数字键盘(0-9)和一个确认按键。
0x03:设备没有键盘,没有显示屏
0x04:设备有显示功能,并且有数字键盘
0x05-0xff:RFU

OOB data flag:(采用外部通讯方法交换一些配对过程中使用的信息,OOB可以是任何一种能够传输响应信息的其他无线通信,如NFC或二维码)
在这里插入图片描述

0x00:不存在OOB
0x01:来自远程设备的OOB身份验证数据
0x02-0xff:RFU

AuthReq:(授权请求,表示STK ,LTK和 GAP绑定信息请求的安全属性)
在这里插入图片描述

Bonding_Flags:绑定标志位 (0b00 不绑定,0b01 绑定)

MITM: (中间人保护标志位)如果设备正在请求MITM保护,则设置为1,否则设置为0。(参考:ble笔记_MITM攻击)

SC: 1表示请求低功耗安全连接。两台设备都支持配对,则使用安全连接,否则采用传统配对。

Keypress:仅当密码输入协议中使用,其他协议忽略。当双方均将该字段设为1,则应使用SMP PairingKeypress Notification PDUs(code 0x0E).发送按键通知。

CT2:1 传输时被设置为1 .支持h7功能

Maximum Encryption Key Size (1 octet)
定义了设备可以的支持的最大加密密钥长度(7-16字节)
Initiator Key Distribution / Generation (1 octet)
发起者密钥分配/生成,设置发起配对者的密钥分配机制
Responder Key Distribution / Generation (1 octet)
响应者密钥分配/生成,设置响应配对者的密钥分配机制

密钥分配主要是5种密钥机制
临时密钥(TK)
短期密钥(STK)
长期密钥(LTK)(包含EDIV 和Rand):用于记录加密后的链接
身份解析密钥(IRK) :用于解析随机地址
连接签名解析密钥(CSPK) :用于签名和验证签名
注:EDIV,辅助密钥,用于识别LTK,每次刷新LTK都会重新生成。Rand,用于识别LTK,每次刷新LTK都会重新生成
在这里插入图片描述

EncKey:
传统配对中,1表示设备应使用Encryption Information(code:0x06)分发LTK。EDIV和Rand 使用Master Identification(code :0x07)来生成。
在LE安全连接中,当SMP在LE传输上运行时,将忽略EncKey字段。EDIV和Rand应设置为零,不得进行分配。,
IdKey:
设置为1,表示设备应使用Identity Information(0x08)分发IRK,然后使用其公共设备或使用身份地址信息分发静态随机地址。
SignKey
设置为1,表示设备应使用Signing Information(0x0A)分发CSRK。
LinkKey:
当SMP在LE传输上运行时,LinkKey字段被设置为1,以指示设备希望从LTK派生出LinkKey。当Initiator Key Distribution / Generation 和 Responder Key Distribution / Generation 字段中的两个设备都将LinkKey设置为1时,应使用从LTK计算BR/EDR链接密钥的程序。不支持LE安全连接的设备应将此位设置为零,并在接收时忽略它。当SMP在BR/EDR传输上运行时,将保留LinkKey字段以供将来使用。


范例:解析抓包数据:
手机->设备:Pairing Request : 0x01 0x04 0x00 0x2d 0x10 0xf 0xf
设备->手机:Pairing Response :0x02 0x03 0x00 0x01 0x10 0x7 0x7
分析过程:
IO Capability
手机:0x04:设备有显示功能,并且有数字键盘 设备:0x03 设备有显示功能,并且有数字键盘
参考以下配对算法:得出采用 【正常连接】方式配对
在这里插入图片描述

OOB data flag:
手机:0x00 ,设备:0x00 没有OOB
AuthReq:
手机0x2d:绑定,使用MITM,加密连接配对, 设备:0x01 绑定,不使用MITM,传统连接配对。
Maximum Encryption Key Size:
手机:0x10 16字节 设备:0x10 16字节
Initiator Key Distribution / Generation :
手机:0xf, 设备:0x07 (协商结果:LTK不派生linkkey)
Responder Key Distribution / Generation (1 octet)
手机:0xf, 设备:0x07 (协商结果:LTK不派生linkkey)

-------------------以上配对第一阶段结束,双方设备的特性进行交换对比,为第二阶段准备----------

传统配对和低功耗安全连接是两条分支,它们的密钥生成方式:
直接连接(Just Works):方法无需输入密码,两端设备仍然执行加密动作,但是TK(初始密码)设为0。这种方法产生的链路是未认证的(Unauthenticated)。在实际使用中,Just Works在配对时候手机屏幕会有弹窗,用户仅需要点一下确认即可。
万能钥匙(Passkey Entry):以一个6字节密码为初始密码,执行加密动作。由于初始密码为随机生成,因而能够保证后续加密行为的安全性。这种方法产生的链路是认证的(Authenticated)。在实际使用中,需要设备具有输出能力用以显示密码,在手机端输入密码,或者反过来设备端有一个输入键盘,手机端提供密码
·带外数据(Out-of-Band,简称OOB):OOB是指利用第三方途径,比如NFC或者WIFI,将Passkey传输给对方。只要这个第三方途径足够安全,就能够保证Passkey的安全,从而避免攻击设备截获Passkey。这个方案受限于第三方途径的匮乏以及操作的复杂性,到目前没有看见有人使用。
低功耗安全连接,除了以上三种方法以外,还增添了一种新方法:
·数值比较(Numeric Comparison):两个设备自行协商生成 6 个数字,并显示出来(要求两个设备具有显示能力),用户比较后进行确认(一致,或者不一致,要求设备有简单的yes or no的确认能力)。

由第一阶段:我们可以看出抓包设备走的是传统配对,密钥生成方式为 Just Works
在这里插入图片描述

主机confirm 计算: Just Works 模式下,TK(临时密钥:0x00)
Mconfirm = c1(TK, Mrand, Pairing Request command,Pairing Response command, initiating device addresstype, initiating device address, responding device addresstype, responding device address)
从机confirm计算: Just Works 模式下,TK(临时密钥:0x00)
Sconfirm = c1(TK, Srand, Pairing Request command,Pairing Response command, initiating device addresstype, initiating device address, responding device address type, responding device address)
抓包数据分析:
在这里插入图片描述

PairingConfirm (Mconfirm):
Code:0x03
Confirm Value: 4bcc93626ff3804bb0510707b01a42cf
PairingConfirm (Sconfirm):
Code:0x03
Confirm Value: 393d84decb7844a99e055d4c8a23bc42

PairingRandom (Mrand):
Code:0x04
Random Value: 935acf3532d748034e5a3c93bed7d773

PairingRandom (Srand):
Code:0x04
Random Value: 7db47c81b175e6691b5e192b4e1f8313

双方验证通过后,使用交换的rand confirm 使用下面公式生成STK:
STK=s1(TK,Srand,Mrand);
这两个交互主要是为了生成STK的,就是我们平时配对输入密码确认的过程。只不过这个例子中密码默认为0,不用手输入。

-以上配对第2阶段结束,双方设备的进行了密码认证,生成了STK,有了STK,就可以加密链路。加密链路并非神秘,它就是向控制器发送一个加密链路的HCI命令(Set_Connection_Encryption,0x0013),具体实施由控制器底层去处理。加密之后的链路,通信数据都要经过密钥进行加密解密。

此时因为第一阶段明确次流程启用了绑定环节,所以到了第三阶段。密钥的分发由第一阶段协商决定。
在这里插入图片描述

抓包数据验证:
在这里插入图片描述

从机->主机:
Encryption Information (Long Term Key)
code:0x06
Long Term Key: 29b55ea9939dc891c75efc523147663b
Master Identification (EDIV, Rand)
code:0x07
Encrypted Diversifier (EDIV): 0xb951
Random Value: 9f19d40d090207cf
Identity Information (Identity Resolving Key)
code:0x08
Identity Resolving Key: 1a324f264df382e7b7dbeccfeb9c2091
Identity Address Information :
Opcode: Identity Address Information (0x09)
Address Type: Public (0x00)
BD_ADDR: Private_11:11:11 (11:11:11:11:11:11)
Signing Information (Signature Key)
Opcode: Signing Information (0x0a)
Signature Key: 377f364c6b40a03456e38bd7c0cbbe98

主机->从机:
Encryption Information (Long Term Key)
Opcode: Encryption Information (0x06)
Long Term Key: 2010989f5a0d298300b7484fb7f51280
Master Identification (EDIV, Rand)
Opcode: Master Identification (0x07)
Encrypted Diversifier (EDIV): 0x7d2e
Random Value: 86a9530129a79245
Identity Information (Identity Resolving Key)
Opcode: Identity Information (0x08)
Identity Resolving Key: 365a4a55239461f7750ba550b98742cc
Identity Address Information :
Opcode: Identity Address Information (0x09)
Address Type: Public (0x00)
BD_ADDR: SamsungE_59:14:81 (20:32:6c:59:14:81)
Signing Information (Signature Key)
Opcode: Signing Information (0x0a)
Signature Key: e56c3f6e70cd980d0267aa98fd554793

---------------------------------------------第三阶段绑定结束----------------------------------------------

接下来测试重连:
在这里插入图片描述

绑定之后,重连主机会发起 加密流程(已经存在LTK):
在这里插入图片描述

协议资料:
LL_ENC_REQ:
在这里插入图片描述

LL_ENC_RSP:
在这里插入图片描述

2.4.2.6 LL_START_ENC_REQ
The LL_START_ENC_REQ PDU does not have a CtrData field.
2.4.2.7 LL_START_ENC_RSP
The LL_START_ENC_RSP PDU does not have a CtrData field.

抓包解析:
LL_ENC_REQ:
Control Opcode: LL_ENC_REQ (0x03)
Random Number: 14917894528598022559 (0xcf0702090dd4199f)
Encrypted Diversifier: 47441 (0xb951)
注:Random Number,Encrypted Diversifier是绑定时生成的,用于标识某一个具体的LTK(0x29b55ea9939dc891c75efc523147663b)
Master Session Key Diversifier: 4901802022275727269 (0x4406b2f7e9093fa5)
注:这是一个64bits的随机数(SKDm) ,用于和SKDs一起生成本次加密的session_key
Master Session Initialization Vector: 3857481247 (0xe5ec7e1f)
注:32bits 的随机数(IVm),和 IVs 一起组成 64bits 的 IV,后面 Encryption Engine 会使用。
LL_ENC_RSP:
Control Opcode: LL_ENC_RSP (0x04)
Slave Session Key Diversifier: 59462768229064293 (0x00d3411299a79e65)
注:这是一个64bits的随机数(SKDs) ,用于和SKDm一起生成本次加密的session_key
Slave Session Initialization Vector: 1066802415 (0x000000003f961cef)
注:32bits 的随机数(IVs),和 IVm 一起组成 64bits 的 IV,后面 Encryption Engine 会使用。
LL_START_ENC_REQ:
Control Opcode: LL_START_ENC_REQ (0x05)
LL_START_ENC_RSP:
Control Opcode: LL_START_ENC_RSP (0x06)

参考文档:https://blog.csdn.net/liwei16611/article/details/85101115?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164016309016780271558951%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164016309016780271558951&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-85101115.pc_search_insert_es_download&utm_term=ble+%E5%8A%A0%E5%AF%86%E8%BF%9E%E6%8E%A5%E8%BF%87%E7%A8%8B&spm=1018.2226.3001.4187

小结:以上使用了一次Just Works 传统配对绑定的方式,粗略解析了配对绑定的过程。配对绑定最关键的一步在于第一阶段,这个阶段要弄懂所以参数的意义。后续流程都是按参数选择下一阶段的操作流程。

配对的另一条支路:低功耗安全连接。这块还没时间整理,也挺好奇

这篇关于ble笔记_SMP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/158340

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus