邮件身份验证代码

消息流用于配置音频切换,请参阅音频切换消息。对于这些重要配置,提供程序需要确保消息由 GMSCore(快速配对模块)发送,而不是由探索器上的任何其他应用发送。

生成 MAC(消息身份验证码)

FP Seeker 使用 HMAC-SHA256 为设备配置消息添加消息身份验证代码。消息的 MAC 由以下前 8 个字节组成:

 sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))

哪里

  1. K 由 concat(账号密钥,48 字节 0)生成。
  2. message 是消息流的额外数据。
  3. Nonce 由 concat(session_nonce, message_nonce) 生成;会话 Nonce 和消息 Nonce 将在下一部分中定义。
  4. opad 是 64 个字节的外填充,由值为 0x5C 的重复字节组成。
  5. ipad 是 64 个字节的内部填充,由值为 0x36 的重复字节组成。

会话 Nonce 和消息 Nonce

为防止重放攻击,提供程序需要确保 Nonce 不重复。由于在 Provider 和 Seeker 上保持时钟或计数器同步并非易事,因此 Provider 会(每个连接)生成会话 Nonce(会在连接期间与所有消息共享),而 Seeker 则会生成每条消息随机生成的消息 Nonce(每条消息)。用于为每条消息生成 MAC 地址的 Nonce 是会话 Nonce 和消息 Nonce 的组合,即 concat(session_nonce, message_nonce)。

我们将会话 Nonce 添加到设备信息事件组:

消息群组名称
设备信息事件 0x03
信息代码名称
会话 Nonce 0x0A

当 RFCOMM 连接时,应生成会话 Nonce 并将其发送给搜寻者:

八位字节 数据类型 说明
0 uint8 设备信息事件 0x03
1 uint8 会话 Nonce 0x0A
2-3 个 uint16 额外的数据长度 0x0008
4-11 人 会话 Nonce 不固定

如需在需要 MAC 时发送消息,搜寻程序将随消息一起发送一个 Nonce 和 MAC。

八位字节 数据类型 说明
0 uint8 消息群组 不固定
1 uint8 邮件内容代码 不固定
2-3 个 uint16 其他数据长度(额外数据长度 + 16) 不固定
4 - n 附加数据 不固定
n + 1 - n + 8 消息 Nonce 不固定
n + 9 - n + 16 邮件身份验证代码 不固定

验证 MAC(消息身份验证代码)

收到包含消息身份验证代码的消息后,Provider 应使用与生成函数相同的函数来验证该消息。也就是说,接收到的 MAC 应等于

 sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))

其中:

  1. Kconcat(account key, 48-byte ZEROs) 生成,且提供程序应遍历所有已存储的帐号密钥以验证 MAC。
  2. message 是消息流的其他数据(不包括消息 Nonce 和 MAC)。

如果 MAC 正确,则提供程序应按照消息的指示执行操作。否则,提供程序应发送包含错误原因 0x3 的 NAK,因为消息身份验证代码不正确。