当前位置: 首页 > news >正文

结合实例从HCI层分析经典蓝牙连接和鉴权过程

我们知道,经典蓝牙BREDR的link key协商是在LMP层做的,那么蓝牙Host在鉴权的过程中,会跟BT SOC有哪些交互:

首次配对

  1. 在HCI Inuqiry找到想要配对的设备后,Host会调用HCI Create Connection命令去连接对方设备,创建ACL连接,如下图,ACL Connection handle = 0x0004:
    在这里插入图片描述
  2. ACL连接创建成功后: 蓝牙HOST会去读取时钟偏移,设置Link Policy(支持role swithc, Hold Mode和Sniff Mode),以及读取对方设备的feature和extended feature:需要注意的是extended feature里的SC Host就是说支持Secure connection,也就是蓝牙4.2采用的基于ECDH鉴权加密机制,如下图:
    在这里插入图片描述
  3. 接下来蓝牙Host还会读取对方设备的名字,会设置APCF的过滤规则(通过0xFD57命令),然后就开始进入鉴权过程,如下图红色框:
    在这里插入图片描述
步骤HCI详解
1HCI Authentication Requested蓝牙host发起鉴权
2HCI Command Status (Success, Command=Authentication Requested)BTSOC响应OK
3HCI Link Key RequestBTSOC请求HOST是否有现成的link key
4HCI Link Key Request Negative ReplyHOST找了一通没有发现对方设备的link key
5HCI Command Complete (Command=Link Key Request Negative Reply, Success)BTSOC响应HOST:好的,我知道了,你没有现成的Link key,我会告诉对方设备的
6HCI IO Capability Request对方设备要来查询HOST的IO capability
7HCI IO Capability Request Reply (IoCapability=Yes/No, HostOobDataPresent=None, Auth=MITM+Dedicated)HOST告诉对方设备IO Capability是支持显示,并且要求认证需要MIMT,以及Dedicated Bond
8HCI Command Complete (Command=IO Capability Request Reply, Success)BTSOC回应HOST,同时会问对方设备的IO Capbility
9HCI IO Capability Response (IoCapability=None, RemoteOobDataPresent=None, Auth=!MITM+General)对方设备的IO Capability是不支持显示,也不支持OOB,不要求MIMT,需要General Bonding
10HCI User Confirmation Request (Pass=039802)经过上面双方交互了IO Capability,双方确定了Numeric comparison配对方式,对方要求显示4个字节字符:039802 ,这里手机上会有一个弹窗显示这几个数字,让用户点击确认
11HCI User Confirmation Request Reply用户点击确认,没错,就是这个数字
12HCI Command Complete (Command=User Confirmation Request Reply, Success)BTSOC把这个用户的确认信息告诉了对方设备
13HCI Simple Pairing Complete (Success)BTSOC和对方设备经过一番LMP交流计算出最终的link key之后,告诉HOST鉴权成功完成。
14HCI Link Key Notification ( Key=F6E7A1F5:80C01AEF:27F16B1B:75C0B7E5, Type=Unauthenticated-256)BTSOC告诉HOST Link key,HOST会帮BTSOC保存在本地。
15HCI Authentication Complete (Success, Connection=0x0004)鉴权成功结束,皆大欢喜。

配对后的连接

如果首次配对结束,蓝牙HOST会保存Link key 在本地,那么下次连接的时候就不需要重新计算Link Key,过程就简单了很多,如下图:
在这里插入图片描述

步骤HCI详解
1HCI Authentication Requested蓝牙host发起鉴权
2HCI Command Status (Success, Command=Authentication Requested)BTSOC响应OK
3HCI Link Key RequestBTSOC请求HOST是否有现成的link key
4HCI Link Key Request Reply (14:6C:27:DF:91:B1, Key=26AF7922:13E89779:8D76C776:C35BA8F2)HOST在本地找到了之前配对过的Link key,然后发给了BTSOC
5HCI Command Complete (Command=Link Key Request Reply, Success, 14:6C:27:DF:91:B1)BTSOC回应了BTHOST给的link key说明没问题
6HCI Authentication Complete (Success, Connection=0x000E)鉴权成功结束。

配对后,但对方设备的Link Key丢失

  1. 对方设备如果擦除了Link Key,那么整个流程就要分为两次了: 由于手机端不知道对方设备的Link Key已经丢失,然后会把之前的配对过的Link Key发给对方,但鉴权肯定是不成功的,对方会返回HCI Authentication Complete (PIN Or Key Missing, Connection=0x000C),如下图:在这里插入图片描述
  2. 由于手机端收到了PIN Or Key Missing,说明对方Link Key已经不存在了,那么需要重新鉴权协商Link Key,这个过程就跟首次配对的流程是一样的,如下图: 在这里插入图片描述

曾经遇到过的问题

之前碰到过一个对方Link key丢失后,手机重新配对,但不会发起A2DP音乐播放的问题,最后通过比较鉴权过程发现有细小差别:
在这里插入图片描述
差别就在于对方设备回复的HCI IO Capability Response ,里面有个Authentication Requirement,正常情况下是0x04,异常情况下是0x00,然后查看Core Spec:
在这里插入图片描述
应该是手机看到这个设备不需要Bonding,所以不会发起A2DP等服务的SDP查询,近而不会进行A2DP播放。


http://www.mrgr.cn/news/81288.html

相关文章:

  • Mysql高级部分总结(二)
  • 【测试】接口测试
  • 又是DNA甲基化,孕期母亲的压力会影响儿童健康
  • 全网最详细vue安装,创建教程
  • pro文件转换为CMakeLists.txt文件,QT官方工具使用教程
  • [Xshell] Xshell的下载安装使用、连接linux、 上传文件到linux系统-详解(附下载链接)
  • Vue3中路由跳转之后删除携带的query参数
  • 蓝牙协议——音乐启停控制
  • 深入理解批量归一化(BN):原理、缺陷与跨小批量归一化(CBN)
  • 类设计者的核查表
  • 耗时半月,终于把牛客网上的软件测试面试八股文整理成了PDF合集(测试基础+linux+MySQL+接口测试+自动化测试+测试框架+jmeter测试+测试开发)
  • shiro权限校验demo
  • 高并发处理 --- Caffeine内存缓存库
  • 图解JVM整体结构、执行流程以及2种架构模型,你学会了吗?
  • 绕组识别标签规范
  • 【基于rust-wasm的前端页面转pdf组件和示例】
  • 蓝牙协议——音量控制
  • Django 管理命令中使用 `logging` 和 输出样式
  • 只谈C++11新特性 - 显式虚函数重写
  • docker 安装minio
  • es 中使用update 、create 、index的区别
  • MQTT协议在树莓派上的安全性和性能测试及其在物联网应用中的应用
  • Dubbo 3.x源码(28)—Dubbo服务发布导出源码(7)应用级服务接口元数据发布
  • 物理层知识要点
  • 论如何优雅地“扒“C代码的底裤 - 白盒审计笔记
  • JWT的生成和工作原理