主题中讨论的其他器件:BQ40Z50-R2
BQ40Z50-R4、BQ40Z50-R3和 BQ40Z50-R2可选择安全存储器位置进行 SHA-1认证。
要将 SHA-1密钥编程到安全存储器中、需要一个特定的命令序列。 对钥匙进行编程后、器件通过电源复位后无法擦除或重新编程。 如需更多信息、请在技术参考手册(TRM)中搜索 SHA1_SECURE 位。
SHA1安全密钥编程顺序:
- 如果器件处于 FW 模式、则发送 cmd 0x00以及数据0x0F00、以使器件进入 ROM 模式
- 为了使器件进入 ROM 模式、必须将其解封并处于完全访问模式。
- 设置地址0中的0x08位
- 设置地址:发送带 cmd 0x09的 SMB 写入字、数据= 0x00
- PEEK 数据:使用 cmd 0x0B 读取 SMB 读取字、 使用 LSB、忽略 MSB
- 或 LSB 为0x08 (即0x08 | LSB)
- POKE 数据:用 cmd 0x0A、data = 0x08 | LSB 发送 SMB 写入字
- 用数据0xC7插入地址2
- 设置地址:发送带 cmd 0x09的 SMB 写入字、数据= 0x02
- POKE 数据:用 cmd 0x0A、data = 0xC7发送 SMB 写入字
- 块写入20字节密钥 F 到命令 AuthWriteKeyF()
- 块写入20字节密钥 C 到命令 AuthWriteKeyC()
- 清除地址0中的0x08位
- 设置地址:发送带 cmd 0x09的 SMB 写入字、数据= 0x00
- PEEK 数据:使用 cmd 0x0B 读取 SMB 读取字、使用 LSB、忽略 MSB
- 从 LSB 清零位0x08
- POKE 数据:在清零位0x08后、用 cmd 0x0A 发送 SMB 写入字、DATA = LSB
- 用数据0x00来插入地址2
- 设置地址:发送带 cmd 0x09的 SMB 写入字、数据= 0x02
- POKE 数据:用 cmd 0x0A、data = 0x00发送 SMB 写入字
如果您不确定密钥编程开始时的状态、可按照以下额外步骤进行验证:
- 挑战
- 读取响应
- 如果响应是空白键响应、则继续编程
- 空白键响应:0x224FA0DFEEF27CD58F32805A70A3F99C0A902F99
- 如果响应是预期的密钥响应、则停止编程、该密钥已编程
- 如果响应是任何其他响应、则停止编程、存在另一个密钥、则无法擦除或重新编程该密钥。
要验证密钥:
计算发送到监测计的20字节密钥 F 的 SHA-1哈希值、按发送内容的相反字节顺序。 密钥 F 是最后8个字节。 键 C 使用相同的步骤。 最后一个密钥是附加到密钥 F 的密钥 C
示例:
如果通过 Authcmd WriteKeyF()为 KeyF 发送2309BDC0A9F86B69111CA850B530339111000C47 (小端字节序)
SHA-1哈希输入、用于查找 keyF:470C0011913330B550A81C11696BF8A9C0BD0923 (大端字节序)
SHA-1哈希输出:8877626BD64ABC4843E43F1E42C5413DB9EDBBA2
如果通过 cmd AuthWriteKeyC()为 KeyC 发送330C0014913530B550A81D10696BF8A9C7BD0613 (小端字节序)
SHA-1哈希输入、用于查找 keyC:1306BDC7A9F86B69101DA850B530359114000C33 (大端字节序)
SHA-1哈希输出:1B8689D48F55F5B5F81D30E012DFB96B7440433C
KeyF = 42C5413DB9EDBBA2、KeyC = 12DFB96B7440433C
SHA-1哈希输入可应对全0的挑战:
KeyF + KeyC +质询= 42C5413DB9EDBBA212DFB96B7440433C000000000000000000000000000000000000000000000000000000000000
响应:1625A385F7343679FD693D727BAC6EE47291D0B
第二个散列是附加到键的第一个散列的响应:
KeyF + KeyC +来自第一个哈希的响应= 42C5413DB9EDBBA212DFB96B7440433C1625A385F7343679FD693D727BAC6EE47291D0B
响应:B0BEF440CAC492FAF09604A46C2C0996512331AF
此响应应与使用全0挑战后从监测计接收到的数据相对应。
命令:
SMBus 命令 |
名称 |
SMBus 协议 |
说明 |
0x1b |
AuthWriteKeyF |
块写入。 块大小为20字节 |
写入 SHA-1拆分密钥的一半(64位)。 在使用 WritAutheKeyC 对拆分密钥的另一半进行编程之前、必须先对其进行编程。 一旦发出 WritAutheKeyC 并随后发出 POR、此位置就不可写入。 |
0x1c |
AuthWriteKeyC |
块写入。 块大小为20字节 |
写入 SHA-1拆分密钥的一半(64位)。 在使用此命令之后执行 POR 后、此位置不可写。 |
0x1d |
AuthKeyChallenge |
块写入。 块大小为20字节 |
向 SHA-1认证例程发送一个20字节质询代码。 该例程计算与编程的客户身份验证密钥对应的20字节质询响应。 在读取响应 cmd 之前、等待22ms 的时间来完成此命令。 |
0x21 |
响应 |
块读取。 块大小为20字节 |
返回上一个发出的质询消息的20字节响应代码。 |