消息身份验证代码
我们使用消息流配置音频切换,请参阅音频切换消息。对于这些重要配置,提供程序需要确保消息由 GMSCore(快速配对模块)发送,而不是 Seek 上的任何其他应用。
生成 MAC(消息身份验证代码)
FP Seeker 使用 HMAC-SHA256 为设备配置消息添加了消息身份验证代码。消息的 MAC 地址由前 8 个字节组成:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
哪里
- K 由 concat(帐号密钥,48 字节 ZERO)生成。
- message 是消息流的额外数据。
- Nonce 由 concat(session_nonce, message_nonce) 生成;会话 Nonce 和消息 Nonce 将在下一节中定义。
- opad 为 64 个字节的外层内边距,由值为
0x5C
的重复字节组成。 - 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)))))
其中:
- K 由
concat(account key, 48-byte ZEROs)
生成,提供程序应遍历所有存储的帐号密钥来验证 MAC。 - message 是消息流的额外数据(不包括消息 Nonce 和 MAC)。
如果 MAC 正确无误,提供程序应按照消息中的说明操作。否则,提供程序应发送 NAK,其中包含错误原因 (0x3) - 因为消息身份验证代码不正确,所以不允许。