赞
踩
了解一个芯片先看手册,先看硬件相关部分,此芯片有多种封装,3管脚芯片为单线通信,8引脚芯片为 I2C 通信,本文主要记录 I2C 通信。
由于设备在使用时需要先行唤醒,需要使用 SDA 管脚发送超过 tWLO = 60us
的时间,也是下面截图提到的 I2C 的频率在低于133kHz时,发送0x00能够达到唤醒的效果。发送完成,需延时至少大于 tWHI = 2.5ms
,让 SDA 管脚为高,其后可进行正常通信。虽然本器件的 I2C 速率可达 1MHz,但为了方便唤醒操作,直接设置速率为 100kMz。
以上简单的描述了发送的数据与回复的数据,例如设备唤醒后,会回复4字节:0x04,0x11,2字节CRC
设备唤醒后就可正常通信,使用 Command 0x03
此处为发送的命令包格式:
Command 的一般命令为 0x03
Count 为 Count 及其之后的所有数据的个数
回复的数据包
Count 为 回复的所有值,包括 Count
Data 为 回复的数据值,有 1字节,4字节,32字节
以上分别列出了 Command 包的 Opcode、Param1、Param2 值列表。
相关的命令操作码如上图 Table 8-6 Command Opcodes ,主要用到了以下几个,下面具体说说。
要想使用芯片,需要先对 Configuration Zone 进行数据进行配置。
主要配置 Slot Configuration:
数据 Slot 总共有16个区域,每个区域可以存储 32 字节。
作为密钥存储,禁止读写,IsSecret(bit7)为1,EncryptRead(bit6)为0,WriteConfig(bit15-12)为never(x01x 或 10xx)
普通数据可以使用加密读写,也可以普通读写,本文主要说明加密读写。加密写 WriteConfig(Bit14)设置为1;加密读 IsSecret(bit7)为1,EncryptRead(bit6)为1
密钥区设置 0x80 0x80
加密读写设置 0xC0 0xF0 (此处的两个字节的低 4 位分别为加密读与写所使用的槽号,此处为 slot0)
写完配置后,需要对 Configuration Zone 中的 Lock Config 加锁
使用 Lock 命令 ,发送 0x03 0x07 0x17 0x80 0x00 0x00 + 2字节CRC
完成配置区域的锁定,就可以写入16个 slot 数据了
这里不加密些的话直接使用 0x12 命令即可,若要使用加密写,则需要先发送 Nonce 与 Gendig, 生成值保存于 TempKey 中
Nonce 发送 0x03 0x1B 0x16 0x00 0x00 0x00 + 20个随机数 + 2字节CRC
此时芯片会返回 32 字节,按上图就行 SHA-256 计算,得出存储在芯片内部的 TempKey 值。
下一步则是发送 GenDig ,GenDig 命令使用 SHA-256 将存储的值与 TempKey 的内容组合起来。
GenDig 发送 0x03 0x07 0x15 0x00 0x00 0x00 + 2字节CRC
初次加密写,此处使用 config 中的 slot0,芯片返回 0 则成功,通过上图红框计算出新的值,同时该值也会由芯片计算,存储 TempKey 中。
加密发送之前,需要先计算出 Mac 值(这里的 Mac 与 Mac Command 是两码事),
TempKey 为 GenDig 后,通过 SHA-256 计算出的值,32字节
PlainTextData 为要发送的数据,32字节
Opcode :0x12
Param1 : 0xC2
Param2 : 所要写入数据的 Slot 值,如下所示:(32字节写入,为其中的 Block)
上图中要发送的 Value 为 GenDig 后,通过 SHA-256 计算出的值 与 所要发送的值 PlainTextData 异或后计算出的值。
数据写完成后,还可对OTP写入,同上。
完成后,锁定数据区:
使用 Lock 命令 ,发送 0x03 0x07 0x17 0x81 0x00 0x00 + 2字节CRC
这时,完成了 config 与 data 区域的锁定,configuration 设置 0x80 0x80 的就无法读写,设置 0xCx 0xFx 则可根据设置加密读写的 Slot 来进行加密读写。
例如:读取未加密 Data slot1 32字节值,直接发送 0x03 0x07 0x02 0x82 0x08 0x00 + 2字节CRC
则返回 0x23 + 32字节 slot1 存储值 + 2字节CRC
读取未加密 Data slot1 最后 4 字节值,直接发送 0x03 0x07 0x02 0x02 0x0F 0x00 + 2字节CRC
加密读时需要先运行GenDig命令,以生成用于解密的密钥。GenDig 使用上面已经提及,先发送 Nonce,然后 GenDig。
例如读取设置 0xCF 0xFF 配置的 Slot1,使用密钥 Slot15 数据,则发送 Nonce 命令,
后发送GenDig 命令 0x03 0x07 0x15 0x02 0x0F 0x00 + 2字节CRC
计算解密密钥时,前32字节为 Slot15 数据,其他没啥变化
而后发送读命令则会返回加密后的 32 字节数据,与上面 GenDig 后计算的解密密钥异或,则可得到 Slot1 中的值。
Mac 命令可返回一个 32字节的 SHA-256 digest,也就是一个在密钥区计算后得出的一个 32字节的 SHA-256 计算值,可与程序内部的已知密钥比较,正确则程序继续运行。可用于相对简单的防抄袭。
例如使用 Slot15 区域的密钥,发送 Mac 命令时也是先发送 Nonce 命令。
Mac 命令发送 0x03 0x07 0x08 0x41 0x0F 0x00 + 2字节CRC,
mode值 0x41,具体如下图,只使用 SN[2:3] 和 SN[4:7]
发送成功,则返回 32字节的 SHA-256 digest,
通过程序内部计算得出一个新的 SHA-256 digest 值,与返回值比较,相同则通过检查,程序可继续运行。相关 是否使用 OTP 与 SN,与发送 Mac 命令时的 Mode 值有关。
该命令主要进行密钥的滚动或者创建新密钥,要使用它,需要在配置 Slot Configuration 时,将其中 Write Config 的 Bit 13 设置为1,同时还分为 Target 和 Parent key,Target key 主要指本身 Slot 值,Parent key 指配置 Slot Configuration 时 WriteKey 设置的 Slot 中的值
使用 DeriveKey 命令时,需要先发送 Nonce(设置mode 为 0x00),
则 DeriveKey 命令中的 TempKey.SourceFlag 为 0(Rand),SlotConfig[TargetKey].Bit15 若是设置,则需要计算 Mac 值,计算数据中的 ParentKey 是 SlotConfig[TargetKey].WriteKey 设置时的 Slot 中的值。
发送 DeriveKey 命令,则所在 Slot 的值发生变化,按上图使用 SHA-256 计算得出值即为所在 Slot 的更新值。
对于 Slot 0~7( Slot 8~14 忽略 SingleUse 位) ,如果 SlotConfig [TargetKey] 的 Bit12 或 SlotConfig [TargetKey] 的 Bit15 被设置为1,且 SlotConfig[ParentKey].SingleUse 也设置为1,在 UseFlag[ParentKey] 为0x00 的情况下,DeriveKey 命令会返回错误。
UseFlag 值 0xFF 为 8 次使用,0x7F为 7次使用,以此类推。
当成功执行时,DeriveKey 总是将 Target key 的 UseFlag 重置为 0xFF,这是重置UseFlag位的唯一机制。
数据 Slot 15 比较特殊,其没有重置机制,在 配置中的 LastKeyUse 都是描述 Slot 15 的有限使用次数,16个 LastKeyUse, 共 128 次使用(可更改使用次数),在128次使用之后,密钥 Slot 15 将永久禁用。
在DeriveKey命令中,SingleUse 位用于 Parent key,但被 Target key 忽略。
https://blog.csdn.net/a5882230/article/details/52214845
源码 :https://github.com/nsood/sha204
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。