蓝牙学习笔记之SMP协议(十四)
目录
写在前面
SM规范简述
安全管理器
加密工具
配对流程
安全属性
IO功能
加密密钥大小
配对算法
低功耗蓝牙安全
密钥和值的定义
分发密钥的生成
密钥分配
安全管理器会话协议
介绍
命令格式
写在前面
安全规范协议,主要是描述LE控制器设备配对、认证、加密等过程进行规定,同时也对相关算法进行了说明。
低功耗蓝牙的安全管理经历了几个阶段,LE传统配对方式和安全连接。
这篇协议基本上是参考蓝牙核心协v5.0议进行的翻译,并且只选取了我认为重要的部分,如果需要深入详细的了解,请自行参考核心协议。如有不当的地方欢迎指正。
SM规范简述
安全管理器(Security Manager,SM)定义了一种协议和行为,用于管理LE-only或BR/EDR/LE设备之间的配对、身份验证和加密。
安全管理器(SM)使用密钥分发方法在无线通信中执行身份验证和加密功能。这意味着每个设备都会生成并控制它分发的密钥,而其他任何设备都不会影响这些密钥的生成。
执行配对以建立可以用于加密链接的密钥。然后执行传输特定密钥分发以共享密钥,该密钥可用于在将来重新连接中加密链路,验证签名数据和随机地址解析。
配对是一个三阶段的过程。前两个阶段始终使用,然后可以选择传输特定的密钥分发阶段
•阶段1:配对功能交换
•阶段2(LE传统配对):短期密钥(Short Term Key,STK)生成
•阶段2(LE安全连接):长期密钥(Long Term Key,LTK)生成
•阶段3:传输特定密钥分发
设备应首先在配对功能交换中交换认证要求和IO功能,以确定在阶段2中应使用以下哪种方法:
- Just Works
- Numeric Comparison(仅适用于LE安全连接)
- Passkey Entry
- Out Of Band(OOB)
从配对功能交换中还确定是使用LE安全连接还是LE传统配对。
然后可以执行阶段3以分发传输特定密钥,例如身份解析密钥(IRK)值和身份地址信息,这一阶段是可选的。无论阶段2中使用的方法如何,阶段1和阶段3都是相同的。
第3阶段只能在通过使用以下方法加密的链接上执行:
- 使用LE传统配对时,第2阶段时生成的STK
- 使用LE安全连接时,在阶段2中生成LTK
- 使用BR / EDR配对生成的共享链接密钥
安全管理器
加密工具
为了支持随机寻址,配对和其他操作,安全管理规范引入了一些加密功能的工具。
定义了以下加密函数:
- ah用于创建在随机地址创建和解析中使用的24位哈希值。
定义以下加密函数以支持LE遗留配对过程:
- c1用于生成配对过程中使用的确认值。
- s1用于在配对过程中生成STK。
定义以下加密函数以支持LE安全连接配对过程:
- f4用于在配对过程中生成确认值。
- f5用于在配对过程中生成LTK和MacKey。
- f6用于在配对过程中的身份验证阶段2期间生成校验值。
- g2用于在配对过程中的身份验证阶段1期间生成6位数字比较值。
- h6用于从安全连接派生的BR / EDR链路密钥生成LE LTK,用于从安全连接派生的LE LTK生成BR / EDR链路密钥。
- h7用于生成中间密钥,同时从安全连接派生的BR / EDR链路密钥生成LE LTK,从安全连接派生的LE LTK生成BR / EDR链路密钥。
加密函数ah,c1和s1构建是根据安全函数e(参考FIPS-197)。
加密函数f4,f5,f6,g2, h6和h7的构建是根据安全功能AES-CMAC(参考RFC-4493)。
配对流程
当配对开始时,配对功能交换应由发起设备启动。如果响应设备不支持配对或无法执行配对,则响应设备将使用配对失败消息进行响应,错误代码为“不支持配对”。
配对功能交换用于交换IO功能,OOB身份验证数据可用性,身份验证要求,密钥大小要求以及传输要分发的特定密钥。IO功能,OOB身份验证数据可用性和身份验证要求用于确定阶段2中使用的密钥生成方法。
所有LE经典配对方法都会生成2个密钥:
- 临时密钥(TK):配对过程中使用的128位临时密钥,用于生成STK
- 短期密钥(STK):用于加密配对后的连接的128位临时密钥。
LE Secure Connections配对方法会生成1个密钥:
- 长期密钥(LTK):128位密钥,用于在配对和后续连接之后加密连接。
安全属性
SM提供的安全属性分为以下几类:
- LE安全连接配对
- 经过身份验证的MITM保护
- 未经身份验证的MITM保护
- 无安全要求
IO功能
组合设备的输入和输出功能组成其IO功能,定义的输入/输出功能如下表:
各个输入和输出功能映射到该设备的单个IO功能,该功能用于配对功能交换。IO功能映射如下表:
加密密钥大小
每个设备应具有最大和最小加密密钥长度参数,这些参数定义了八位字节中允许的加密密钥的最大和最小大小。最大和最小加密密钥长度参数应在7个八位位组(56位)和16个八位位组(128位)之间
配对算法
在阶段1中交换的信息用于选择在阶段2中使用哪种密钥生成方法。
1) 密钥生成方法选择
在LE遗留配对中,如果两个设备都具有带外认证数据,则在选择配对方法时优先使用带外配对方法。否则,应使用设备的IO功能来确定配对方法。
在LE安全连接配对中,如果一个或两个设备具有带外认证数据,则在选择配对方法时优先使用带外配对方法。否则,应使用设备的IO功能来确定配对方法。
如果两个设备都未设置MITM选项,则应忽略IO功能并使用Just Works关联模型。
当有至少有一方不支持安全连接时,即使用LE经典配对时,STK的生成方法参考下图。当双方都支持安全连接时,与经典配对生成方法不同点在于,当有至少有一方支持OOB时,就优先使用OOB。
当双方都不支持OBB时,应使用IO功能确定配对方法,对照表如下:
2) LE 传统配对的阶段2
在经典配对的第二阶段,双方的设备都会用c1函数生成confirm值,并将confirm和rand(用于生成confirm)发给对端设备,双方收到对方rand之后利用c1重新生成confirm并于对方发过来的confirm对比,匹配则通过认证。认证通过则用s1函数生成STK
3) LE 安全连接配对的阶段2
1.公钥交换
最初,每个设备生成其自己的椭圆曲线Diffie-Hellman(ECDH)公钥 - 私钥对。通过发起设备将其公钥发送到接收设备来启动配对。响应设备用自己的公钥回复这个公钥。
2.认证阶段1
认证阶段1可以使用just work,数字比较,密钥输入和带外的方式,其过程分别如下图所示
just work或数字比较
密钥输入
带外
3.认证阶段2
在认证的阶段1完成之后,利用阶段1交换的数据和计算出的LTK生成认证值,具体流程如下图:
低功耗蓝牙安全
安全性应由设备中master方的安全管理器发起。从设备可以请求主设备启动配对或其他安全过程。
密钥分发阶段中的从设备为主设备提供密钥,因此可以加密重新连接,可以解析其随机地址,或者主设备可以验证来自从设备的签名数据。
主设备还可以向从设备提供密钥,因此如果角色被反转,主机的随机地址可以被解析,或者从设备可以验证来自主设备的签名数据,则可以加密重新连接。
密钥和值的定义
LE安全性使用以下密钥和值进行加密,签名和随机寻址:
1. 身份解析密钥(IRK)是用于生成和解析随机地址的128位密钥。
2. 连接签名解析密钥(CSRK)是一个128位密钥,用于在接收设备上签名数据和验证签名。
3. 长期密钥(LTK)是128位密钥,用于为加密连接而生成的会话密钥。
4. 加密分集器(EDIV)是16位存储值,用于识别在LE遗留配对期间分配的LTK。每次分配唯一的LTK时都会生成一个新的EDIV。
5. 随机数(Rand)是64位存储值,用于标识在LE遗留配对期间分配的LTK。每次分配唯一的LTK时都会生成一个新的Rand。
分发密钥的生成
可以使用任何生成正在分发的密钥的方法,这些密钥导致密钥具有128位熵,因为生成方法在从属设备外部是不可见的。密钥不应仅从分发给主设备的信息生成,也不应仅从从设备外部可见的信息生成。
这些密钥包括IRK,CSRK,LTK,EDIV,Rand,BR/EDR Link Key
密钥分配
在LE传统配对中,从设备可以向主站分配以密钥:
- LTK,EDIV和Rand
- IRK
- CSRK
主设备可以向从设备分配以下密钥:
- LTK,EDIV和Rand
- IRK
- CSRK
在LE安全连接中,主设备和从设备可以分发以下密钥:
• IRK
• CSRK
安全管理器会话协议
介绍
安全管理器协议(SMP)用于配对和传输特定密钥分发。
所有SMP命令都通过安全管理器通道发送,该通道是L2CAP固定通道,BR/EDR是0x0007,LE是0x0006。
命令格式
所有SMP命令的一般格式如下图所示:
Data字段的长度可变。code字段确定data字段的格式。Code字段长度为一个字节,用于标识命令的类型。下表列出了蓝牙规范定义的代码:
上面每一个定义规范中都有详细的描述,具体参考核心协议,Vol 3,Part H,第3.5和3.6节,下面我举两个例子简单的说一下,作为参考:
1)Pairing Request
发起方通过向回应设备发送配对请求命令来启动配对功能交换。配对请求命令如下图所示:
其各个字段的意义如下:
- IO Capability:定义了交换IO功能时使用的值
- OOB data flag:指示OOB认证数据是否可用
- AuthReq:表示STK和LTK以及GAP绑定信息的请求安全属性
MITM:如果设备正在请求MITM保护,则设置为1,否则应设置为0
SC:如果设备支持LE安全连接配对,则应设置为1,否则应设置为0
Keypress:仅在Passkey Entry协议中使用。当双方将该字段设置为1时,应使用Keypress Notification命令发送Keypress通知。
CT2:设置为1以指示支持h7功能
RFU:未使用
- Maximum Encryption Key Size:最大加密密钥大小
- Initiator Key Distribution / Generation:发起者密钥分配/生成
指示发起方请求在传输特定密钥分发阶段,分配/生成或使用哪些密钥
- Responder Key Distribution / Generation:响应者密钥分配/生成
指示发起方在传输特定密钥分发阶段期间,请求响应者分发/生成或使用哪些密钥
2)Pairing Respone
如果响应设备允许配对,则响应设备使用该命令在从发起设备接收到配对请求命令之后完成配对功能交换。配对响应命令如下图:
字段定义基本与request包类似,下面两个描述略有不同:
- Initiator Key Distribution / Generation:发起者密钥分配/生成
定义了发起者在传输特定密钥分发阶段应分配和使用的密钥
- Responder Key Distribution / Generation:响应者密钥分配/生成
定义了响应者在传输特定密钥分发阶段应分配和使用的密钥
其他的指令类似,请自行参考核心规范。
规范的附录中也有完成的配对流程图,在附录C中,有兴趣的可以自行了解。
蓝牙学习笔记之SMP协议(十四)相关推荐
- 【GANs学习笔记】(二十四)StyleGAN
完整GANs笔记:http://www.gwylab.com/note-gans.html StyleGAN详细解读:http://www.gwylab.com/pdf/Note_StyleGAN.p ...
- 蓝牙学习笔记之HCI协议(一)
目录 协议浅述 HCI简介 HCI协议数据格式 HCI Command Packet HCI ACL Data Packet HCI Synchronous(SCO) Data Packet
- 风变python基础语法第11关_Python基础语法学习笔记之风变第十四关项目实操
一.明确项目目标 需要一个图书管理系统,来帮助他管理书籍的借阅情况.他希望这个简易的程序可以做到: 二.分析过程,拆解项目 第一种用法是使用类生成实例对象.类作为实例对象的模版,每个实例创建后,都将拥 ...
- 学习笔记:带你十天轻松完成 Go 微服务系列(二)- 服务拆分
学习笔记:带你十天轻松搞定 Go 微服务系列(二) 1.学习课程 2.服务拆分 2.1 按业务服务拆分 2.2 按调用方式拆分 3.创建项目目录 3.1 在 code 中新建项目 3.2 创建 mal ...
- 零基础带你学习MySQL—数学函数(十四)
零基础带你学习MySQL-数学函数(十四)
- 【转】:TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute
TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute 分类: TCP/IP详解学习笔记计算机网络2006-04-20 18:147970人阅读评论(1)收 ...
- 网络协议(十四):WebSocket、WebService、RESTful、IPv6、网络爬虫、HTTP缓存
网络协议系列文章 网络协议(一):基本概念.计算机之间的连接方式 网络协议(二):MAC地址.IP地址.子网掩码.子网和超网 网络协议(三):路由器原理及数据包传输过程 网络协议(四):网络分类.IS ...
- 【Python学习笔记—保姆版】第四章—关于Pandas、数据准备、数据处理、数据分析、数据可视化
第四章 欢迎访问我搞事情的[知乎账号]:Coffee 以及我的[B站漫威剪辑账号]:VideosMan 若我的笔记对你有帮助,请用小小的手指,点一个大大的赞哦. #编译器使用的是sypder,其中&q ...
- 网络协议学习笔记-IGMP协议
网络协议学习笔记-IGMP协议 http://hi.baidu.com/clxye/item/3db870336d86c0c11a969614 IGMP协议(Internet Group Man ...
- 【Vue2.0学习】—插槽(六十四)
[Vue2.0学习]-插槽(六十四) 作用:让父组件可以向子组件指定的位置插入html结构,也是一种组件间通信的方式,适用于 父组件=>子组件 分类:默认插槽.具名插槽.作用域插槽 默认插槽 使 ...
最新文章
- 关闭Delphi的RTTI
- Linux下使用nmap扫描局域网存活的IP
- mysql dbcollat_Mysql Server 层混杂信息字典表 | 全方位认识 information_schem(四)
- 网站压力测试工具webbench简介、安装、使用
- 高清 网络摄像机 华为海思3510芯片
- tensorflow 笔记 16:tf.pad
- 渝粤教育 陕西师范大学 《初级微观经济学》作业
- python函数的使用场景_详解python中strip函数的使用场景
- 我优化多年的 C 语言竟然被 80 行 Haskell 打败了?
- mysql duplicate id_mysql 使用ON DUPLICATE KEY UPDATE 时导致的自增主键id无限增大问题
- 最清楚的01背包问题讲解
- Map与JSON数据之间的互相转化
- 局域网传输文件_如何“互传文件”?简单几步,方便快捷
- Programe_Of_Beauty:2.17 数组循环位移
- JPA并发save失效
- Kindeditor在线 HTML 编辑器使用
- Android手机ram大小,安卓手机RAM容量演进史,如何从192MB走到16GB,HTC:我有话要说...
- 2021 ICCV论文分享 | 遮挡边界检测
- 北邮智能车仿真培训(六)—— 修改模型参数
- Ubuntu 18.04 安装 xdm 2018 ( Xtreme Download Manager 2018 )
热门文章
- oracle的oca证书,Oracle三大认证考试及其含金量解析
- 详解马氏距离中的协方差矩阵计算(超详细)
- openssl1.1.1下载地址
- HarmonyOS DevEco Studio版本更新
- 测判三极管的口诀 (挑战者)
- 股权-公司治理的至高点,如何合理运用股权(融人、融资、融市场) 张明若
- [技术讨论]从ERP免费开始到做人做事的讨论
- excel单元格内加空格_如何将Excel一个单元格中空格隔开的内容在不同单元格显示...
- 厦大C语言上机 1360 算日期
- Android开发之so文件使用方法详解