邮件身份验证代码
消息流用于配置音频切换,请参阅音频切换消息。对于这些重要配置,提供程序需要确保消息由 GMSCore(快速配对模块)发送,而不是由探索器上的任何其他应用发送。
生成 MAC(消息身份验证码)
FP Seeker 使用 HMAC-SHA256 为设备配置消息添加消息身份验证代码。消息的 MAC 由以下前 8 个字节组成:
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
哪里
- K 由 concat(账号密钥,48 字节 0)生成。
- 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 并将其发送给搜寻者:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
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)))))
其中:
- K 由
concat(account key, 48-byte ZEROs)
生成,且提供程序应遍历所有已存储的帐号密钥以验证 MAC。 - message 是消息流的其他数据(不包括消息 Nonce 和 MAC)。
如果 MAC 正确,则提供程序应按照消息的指示执行操作。否则,提供程序应发送包含错误原因 0x3 的 NAK,因为消息身份验证代码不正确。