消息认证码
消息流用于配置音频切换,请参阅音频切换消息。对于这些重要配置,提供方需要确保消息由 GMSCore(快速配对模块)发送,而不是由搜寻器上的任何其他应用发送。
生成 MAC(消息验证码)
FP Seeker 使用 HMAC-SHA256 为设备配置消息添加了消息身份验证代码。消息的 MAC 由以下内容的前 8 个字节组成:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
其中
- K 由 concat(账号密钥, 48 字节的零) 生成。
- message 是 Message 流的附加数据。
- nonce 通过 concat(session_nonce, message_nonce) 生成;会话 nonce 和消息 nonce 在下一部分中定义。
- opad 是 64 字节的外部填充,由值为
0x5C的重复字节组成。 - 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)))))
其中:
- K 由
concat(account key, 48-byte ZEROs)生成,提供方应遍历所有存储的账号密钥以验证 MAC。 - message 是消息流的附加数据(不包括消息随机数和 MAC)。
如果 MAC 正确,提供方应遵循消息的指令。否则,提供方应发送 NAK 并说明错误原因,即 0x3 - 由于消息身份验证代码不正确而导致不允许。