消息身份验证代码

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

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

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

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

哪里

  1. K 由 concat(帐号密钥,48 字节 ZERO)生成。
  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 并将其发送给 Seek:

八位字节 数据类型 说明
0 U8 设备信息事件 0x03
1 U8 会话 Nonce 0x0A
2 - 3 条 uint16 额外的数据长度 0x0008
4 - 11 会话 Nonce 不尽相同

如需在需要 MAC 时发送消息,跳转控件会将消息 Nonce 和 MAC 连同消息一起发送。

八位字节 数据类型 说明
0 U8 消息组 不尽相同
1 U8 邮件内容代码 不尽相同
2 - 3 条 uint16 额外的数据长度(额外的数据长度 + 16) 不尽相同
4 - n 附加数据 不尽相同
n + 1 - n + 8 消息 Nonce 不尽相同
n + 9 - n + 16 消息身份验证代码 不尽相同

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

在收到包含消息身份验证代码的消息后,提供程序应使用与生成函数相同的函数对其进行验证。也就是说,收到的 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 正确无误,提供程序应按照消息中的说明操作。否则,提供程序应发送 NAK,其中包含错误原因 (0x3) - 因为消息身份验证代码不正确,所以不允许。