微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android BLE 配对和 BREDR 密钥分配

如何解决Android BLE 配对和 BREDR 密钥分配

我是一名开发人员,正在开发使用 Qualcomm SoC 进行蓝牙和音频处理的蓝牙耳机产品。我们的产品将 BREDR 蓝牙用于“经典”配置文件 (HFP/AVRCP/A2DP),将 LE 用于移动应用和 OTAU。

我们期望用户执行的典型流程是:

  1. 使用智能手机的蓝牙设置进行 BREDR 配对。这使用了生成 P192 加密密钥的传统 BREDR“简单配对”方法
  2. 用户打开我们的应用,这将在应用尝试访问我们的自定义 GATT 服务时触发 LE 配对。

由于兼容性问题,我们的耳机不支持通过 BREDR 的安全连接,但它支持 LE 安全连接。因此,通常会在 LE 配对完成后,根据 LE 长期密钥重新计算 BREDR 链接密钥,这使其具有 P256 加密功能。 例如,以下是 BREDR 配对后耳机永久存储中的链接键的样子:

Device #0: addr_type=PUBLIC
BDADDR = xxxx xx xxxxxx
BREDR key: bbb...b (AUTHENTICATED P192)

和LE配对后:

Device #0: addr_type=PUBLIC 
BDADDR = xxxx xx xxxxxx
BREDR key: aaa...a (AUTHENTICATED P256)
LE CENTRAL Key : 0000 (EVID) 0000000000000000 (RAND) bbb...b (LTK)
LE IRK: ccc...c

现在,这对于大多数平台来说都不是问题,但最近我开始看到某些运行 Android 10/11 的 Android 设备和一些运行 Android 9 且带有最新安全补丁的设备存在问题。基本上发生的事情是在 LE 配对之后我无法创建任何新的 BREDR ACL。连接总是在 LMP_rand_au -> sres 响应阶段失败——本质上移动设备在 LE 配对后没有重新计算它的 BREDR 链接密钥,现在设备不再同意 LTK。我在耳机设备中明确禁用了 Cross-Transport Key Derivation,但在 LE 密钥分配后 BREDR 密钥仍然更改。这在 iOS 设备上似乎根本不是问题。有没有其他人遇到过这个问题?有关如何进行的任何建议? 到目前为止,我已经尝试过:

  1. 禁用 LE 链接密钥分发:这可以防止重新计算 BREDR 密钥,因为没有 LE LTK/IRK。然而,一旦手机改变其随机LE地址,用户将被强制重新配对。这也会导致我在耳机设备上的可信设备列表膨胀,而且非常有限
  2. 在 LE 安全性完成后强制 LTK 更改 - 有一个 HCI 命令明确用于重新派生 LTK。然而,尝试这样做会导致各种令人讨厌的奇怪行为。也许我的耳机 SoC 不完全支持
  3. 在 LE 配对之前保存 BREDR LTK,并在 LE 配对后重置它。这允许 BREDR 连接,这让我怀疑问题出在移动设备上。但是,这当然会阻止用户访问移动应用。

解决方法

好的,我实际上设法从 Qualcomm 获得了有关此问题的一些技术支持。问题出在 Android 设备中,因此解决方案是强制禁用耳机中的 CTKD,即使禁用了 BREDR 安全连接。高通公司的 API 无法做到这一点,我被迫更改了高通公司在 ADK 中提供的开源连接库中的一些文件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。