Android BLE 配对和 BREDR 密钥分配

Android BLE pairing and BREDR key distribution

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

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

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

由于兼容性问题,我们的耳机不支持通过 BREDR 的安全连接,但它支持 LE 安全连接。所以通常发生的事情是在 LE 配对完成后,BREDR link 密钥根据 LE 长期密钥重新计算,这赋予它 P256 加密能力。 例如,在 BREDR 配对后,耳机永久存储中的 link 键看起来像这样:

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 设备 运行ning Android 10/11 和某些设备存在问题运行ning Android 9 有最新的安全补丁。基本上,在 LE 配对后我无法创建任何新的 BREDR ACL。连接总是在 LMP_rand_au -> sres 响应阶段失败 - 本质上,移动设备在 LE 配对后没有重新计算其 BREDR link 密钥,现在设备不再同意 LTK。我在我的耳机设备中明确禁用了交叉传输密钥派生,但 BREDR 密钥在 LE 密钥分发后仍发生更改。这在 iOS 设备上似乎根本不是问题。还有其他人 运行 关注这个问题吗?关于如何进行的任何建议? 到目前为止我已经尝试过:

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

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