Android BLE 配对和 BREDR 密钥分配
Android BLE pairing and BREDR key distribution
我是一名开发蓝牙耳机产品的开发人员,使用 Qualcomm SoC 进行蓝牙和音频处理。我们的产品将 BREDR 蓝牙用于“经典”配置文件 (HFP/AVRCP/A2DP),将 LE 用于移动应用程序和 OTAU。
我们期望用户执行的典型流程是:
- BREDR 使用 smartphone 的蓝牙设置进行配对。这使用产生 P192 加密密钥的传统 BREDR“简单配对”方法。
- 用户打开我们的应用程序,当该应用程序尝试访问我们的自定义 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 设备上似乎根本不是问题。还有其他人 运行 关注这个问题吗?关于如何进行的任何建议?
到目前为止我已经尝试过:
- 禁用 LE link 密钥分发:这可以防止重新计算 BREDR 密钥,因为没有 LE LTK/IRK。然而,一旦移动 phone 更改其随机 LE 地址,用户将被迫重新配对。这也会导致我在耳机设备上的受信任设备列表膨胀,而且非常有限
- 在 LE 安全完成后强制更改 LTK - 有一个 HCI 命令明确用于重新派生 LTK。然而,尝试这样做会导致各种令人讨厌的奇怪行为。也许我的耳机 SoC 不完全支持它
- 在 LE 配对之前保存 BREDR LTK,并在 LE 配对之后重置它。这允许 BREDR 连接,这让我怀疑问题出在移动设备上。然而,这当然会阻止用户访问移动应用程序。
好的,我实际上设法从高通公司获得了有关此问题的一些技术支持。问题出在 Android 设备中,因此解决方案是在禁用 BREDR 安全连接时强制禁用耳机中的 CTKD。这对于高通的 API 是不可能的,我被迫更改高通在 ADK 中提供的开源连接库中的一些文件。
我是一名开发蓝牙耳机产品的开发人员,使用 Qualcomm SoC 进行蓝牙和音频处理。我们的产品将 BREDR 蓝牙用于“经典”配置文件 (HFP/AVRCP/A2DP),将 LE 用于移动应用程序和 OTAU。
我们期望用户执行的典型流程是:
- BREDR 使用 smartphone 的蓝牙设置进行配对。这使用产生 P192 加密密钥的传统 BREDR“简单配对”方法。
- 用户打开我们的应用程序,当该应用程序尝试访问我们的自定义 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 设备上似乎根本不是问题。还有其他人 运行 关注这个问题吗?关于如何进行的任何建议? 到目前为止我已经尝试过:
- 禁用 LE link 密钥分发:这可以防止重新计算 BREDR 密钥,因为没有 LE LTK/IRK。然而,一旦移动 phone 更改其随机 LE 地址,用户将被迫重新配对。这也会导致我在耳机设备上的受信任设备列表膨胀,而且非常有限
- 在 LE 安全完成后强制更改 LTK - 有一个 HCI 命令明确用于重新派生 LTK。然而,尝试这样做会导致各种令人讨厌的奇怪行为。也许我的耳机 SoC 不完全支持它
- 在 LE 配对之前保存 BREDR LTK,并在 LE 配对之后重置它。这允许 BREDR 连接,这让我怀疑问题出在移动设备上。然而,这当然会阻止用户访问移动应用程序。
好的,我实际上设法从高通公司获得了有关此问题的一些技术支持。问题出在 Android 设备中,因此解决方案是在禁用 BREDR 安全连接时强制禁用耳机中的 CTKD。这对于高通的 API 是不可能的,我被迫更改高通在 ADK 中提供的开源连接库中的一些文件。