邮件身份验证码
消息流用于配置音频切换,请参阅 音频切换消息。对于这些重要的配置,提供程序需要 以确保消息由 GMSCore(快速配对模块)发送,而不是由任何 Seeker 中的其他应用。
生成 MAC(消息身份验证代码)
FP 搜寻器为设备配置消息添加消息身份验证码 并使用 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 未 重复。由于在两个提供程序上保持时钟或计数器同步 且 Seeker 并不简单,因此提供程序会生成会话 Nonce (根据连接),在连接期间与所有消息共享, 而搜寻器则会生成消息 Nonce(每条消息),该 Nonce 由 为每条消息生成的内容。为每条消息生成 MAC 的 Nonce 为 会话 Nonce 和消息 Nonce 的组合,即 concat(session_nonce, message_nonce)。
我们将会话 Nonce 添加到设备信息事件组:
邮件群组名称 | 值 |
---|---|
设备信息事件 | 0x03 |
消息代码名称 | 值 |
---|---|
会话 Nonce | 0x0A |
当 RFCOMM 时,应生成会话 Nonce 并将其发送给 Seeker 连接:
八位字节 | 数据类型 | 说明 | 值 |
---|---|---|---|
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 + 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 - 不允许,因为信息验证代码不正确。