快速配对过程

过程

Seek 工具先启用基于密钥的配对特性的通知,然后再将其写入表 1.1 中,而不是立即调用任何常规 BR/EDR 或 BLE 绑定过程。

处理来自快速配对查找程序的写入请求时,快速配对提供程序应执行以下操作:

  1. 如果存在可选公钥字段:
    1. 如果设备未处于配对模式,请忽略写入并退出。
    2. 否则:
      1. 使用收到的公钥(secp256r1 的椭圆曲线上的 64 字节点)、预安装的反欺骗私钥(以及 secp256r1)和椭圆曲线 Diffie-Hellman 算法来生成 256 位 AES 密钥。
      2. 使用 SHA-256 对 256 位 AES 密钥进行哈希处理。
      3. 截取结果的前 128 位。此 AES 密钥是反欺骗 AES 密钥,将在下一步中使用。
  2. 使用 AES-128 尝试解密值。由于该值是单个 16 字节 AES 分块,因此不需要 IV 或多块加密模式。

    1. 应使用哪个密钥:
      1. 如果第 1 步生成了反欺骗 AES 密钥,请使用该密钥。
      2. 否则,请尝试使用持久帐号密钥列表中的每个密钥。
    2. 如果密钥成功解密了值,则中断并继续下一步。
    3. 如果输出符合表 1.2.1表 1.2.2 的格式(即,如果其中包含快速配对提供程序的当前 BLE 地址或快速配对提供程序的公共地址),该值将成功解密。

      注意:数据包末尾附加了一个盐。应尽可能跟踪这些盐,如果提供程序收到包含已使用的盐的请求,则应忽略该请求,以免重放攻击。

    4. 作为跟踪盐的替代方法,如果写入包含提供程序的专用地址,则可防止重放攻击的另一种方法是向前写入下一次可解析私有地址的时间,这样系统就会在轮替下次接受基于密钥的配对写入之前进行轮替。

  3. 如果没有密钥可以成功解密值,请忽略写入并退出。

    1. 记录这些失败。当失败计数达到 10 时,立即使所有新请求失败。在 5 分钟后、开机或成功后重置失败计数。
  4. 否则,请将成功的密钥保存为 K。将此 K 标记为可用于解密通过此 LE 链路收到的密钥和个性化名称写入操作,但不用于解密其他链接或任何其他链接的任何写入操作。启动一个计时器,如果未开始配对,系统会在 10 秒后舍弃 K。如果此 LE 链路断开连接,也舍弃 K

  5. 通过将该类型和提供商的 BR/EDR 地址串联起来,然后使用随机字节块(即盐)填充数据包的其余部分,以生成表 1.3 中显示的 16 字节原始响应。

  6. 使用 K 加密原始响应以生成表 1.4 中显示的 16 字节加密响应。通过有关基于密钥的配对特性的通知发送此内容。

  7. 读取请求标志:

    1. 如果请求的标志字节的位 2 设为 1,请以个性化名称通知其他数据特征
    2. 如果请求的标志字节的位 1 设为 1
      1. 这表示搜索器正在请求提供程序发起与跳转器的 BR/EDR 地址(位于 8-13 字节中的地址)的连接。
      2. 向 Seek 的 BR/EDR 地址发送配对请求。配对请求必须如下所述(在“配对期间”步骤)。
      3. 需要这样做的原因:让提供程序启动可解决某些设备上的问题。
    3. 如果请求的 flag 字节的位 1 设为 0,请执行以下操作
      1. 等待配对请求最多需要 10 秒。如果未接收到任何消息,请退出。
      2. 请注意,这可能是从其他地址(搜索者的公开地址,而不是其可解析的专用地址)的 BR/EDR 请求。我们将在配对期间重新验证发出请求的设备是否拥有 K
  8. 配对期间:

    1. 收到来自“寻找器”的配对请求/响应数据包:如果请求中的设备功能为 NoInput/NoOutput,请结束配对,以避免使用 Just Works 配对方法。
    2. 对于提供程序发送的配对请求/响应数据包:将“设备功能”字段设置为 Display/YesNo,并将“身份验证要求”设置为需要 MITM 保护。这会触发数值比较配对方法(在 Android 上也称为“密钥确认”)。我们依靠它来确认发出请求的设备确实是快速配对查找器,并且不存在中间人。查看示例
    3. 需要这样做的原因:带外配对方法可能更为合适,但平台未在所有需要的 Android 版本上公开该方法。
  9. 需要确认通行密钥时,最多等待 10 秒即可写入通行密钥特性

    1. 通常,借助这种配对方法,用户可以确认每台设备屏幕上显示的匹配密钥是相同的。而是仅针对此配对,我们通过 BLE 传输这些密钥,并使用受信任的预共享密钥进行加密。
    2. 请注意,此方法不适用于具有屏幕或键盘的设备,因为它会对 MITM 保护略有影响。因此,快速配对目前尚不支持这些设备类型。
    3. 如果 10 秒的计时器到期,但未写入密钥,则舍弃 K
  10. 将值写入密钥特性时,这是加密的密钥块。使用 K 解密,得到一个原始密钥块,格式如下:特征:密钥 > 表 2.2 -(类型 = 寻找者的密钥)。

  11. 如果解密失败,请忽略写入并舍弃 K

  12. 否则,原始密钥块将包含一个 6 位数的 PSeeker(搜索者期望的密钥)。

  13. PSeeker 与我们自己的预期通行密钥 PProvider 进行比较。

    1. 如果值相等,请回复“是”。
    2. 否则,回复“no”即可确认配对失败。
  14. 无论配对是否失败,都会生成另一个原始密钥块,其格式在特征:密码>表 2.2 中包含我们自己的预期密钥 PProvider

    1. 确保代码块的类型正确(提供商的通行密钥;请参阅表格)。 注意:请勿重复使用从跳转程序收到的通行密钥块中的盐。生成新的随机值。
  15. 使用 K 加密原始密钥块,然后通过对密钥特性的通知发送生成的加密密钥块。

  16. 如果 Seek 收到并解密正确的通行密钥 P,Seeker 还会回复“yes”,确认配对成功。

    1. 如果配对成功,则将 K 标记为可用于对此 LE 链路上的帐号密钥写入操作解密,但不可用于任何后续的通行密钥写入,也不可用于任何其他链接上的写入操作。启动计时器,并在 10 秒后舍弃 K。此外,每次尝试写入帐号密钥后,如果 LE 链路断开连接,则舍弃 K
    2. 如果配对失败,请舍弃 K
  17. 将设备功能字段切换回 NoInput/NoOutput,并将身份验证要求切换为 MITM Protection Not required,以便新的配对继续按预期运行。

示例
示例 1:成功配对尝试(没有中间人)。
示例 2:尝试配对失败,有一个中间人。