消息认证码

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

生成 MAC(消息验证码)

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

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

其中

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

会话随机数和消息随机数

为防止重放攻击,提供方需要确保随机数不重复。由于在提供方和寻求方上保持时钟或计数器同步并不简单,因此提供方会生成会话随机数(每个连接一个),该随机数在连接期间与所有消息共享,而寻求方会生成消息随机数(每条消息一个),该随机数是为每条消息随机生成的。用于生成每条消息的 MAC 的随机数是会话随机数和消息随机数的组合,即 concat(session_nonce, message_nonce)。

我们向“设备信息”事件组添加了会话随机数:

消息组名称
设备信息事件 0x03
消息代码名称
会话随机数 0x0A

当消息流连接时,应生成会话随机数并将其发送给 Seeker:

Octet 数据类型 说明
0 uint8 设备信息事件 0x03
1 uint8 会话随机数 0x0A
2 - 3 uint16 其他数据长度 0x0008
4 - 11 会话 nonce 各不相同

如果需要 MAC,搜索者将发送消息随机数和 MAC,以及消息本身。

Octet 数据类型 说明
0 uint8 消息群组 各不相同
1 uint8 消息代码 各不相同
2 - 3 uint16 其他数据长度(其他数据长度 + 16) 各不相同
4 - n 附加数据 各不相同
n + 1 - n + 8 消息随机数 各不相同
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 是消息流的附加数据(不包括消息随机数和 MAC)。

如果 MAC 正确,提供方应遵循消息的指令。否则,提供方应发送 NAK 并说明错误原因,即 0x3 - 由于消息身份验证代码不正确而导致不允许。