加密芯片ATSHA204之使用

3 篇文章 0 订阅


本文旨在记录 ATSHA204 的使用过程。ATSHA204 是一个安全认证和验证设备,可防止设备被抄袭,应该可以算一个加密芯片。

看手册

  了解一个芯片先看手册,先看硬件相关部分,此芯片有多种封装,3管脚芯片为单线通信,8引脚芯片为 I2C 通信,本文主要记录 I2C 通信。
在这里插入图片描述
在这里插入图片描述
  由于设备在使用时需要先行唤醒,需要使用 SDA 管脚发送超过 tWLO = 60us 的时间,也是下面截图提到的 I2C 的频率在低于133kHz时,发送0x00能够达到唤醒的效果。发送完成,需延时至少大于 tWHI = 2.5ms ,让 SDA 管脚为高,其后可进行正常通信。虽然本器件的 I2C 速率可达 1MHz,但为了方便唤醒操作,直接设置速率为 100kMz。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上简单的描述了发送的数据与回复的数据,例如设备唤醒后,会回复4字节:0x04,0x11,2字节CRC

Command Packets

设备唤醒后就可正常通信,使用 Command 0x03
在这里插入图片描述
此处为发送的命令包格式:
Command 的一般命令为 0x03
Count 为 Count 及其之后的所有数据的个数
在这里插入图片描述
回复的数据包
Count 为 回复的所有值,包括 Count
Data 为 回复的数据值,有 1字节,4字节,32字节
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上分别列出了 Command 包的 Opcode、Param1、Param2 值列表。

相关的命令操作码如上图 Table 8-6 Command Opcodes ,主要用到了以下几个,下面具体说说。

  • DeriveKey Command
  • GenDig Command
  • Lock Command
  • MAC Command
  • Nonce Command
  • Read Command
  • Write Command

Configuration Zone

要想使用芯片,需要先对 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)

Lock Command

写完配置后,需要对 Configuration Zone 中的 Lock Config 加锁
在这里插入图片描述
使用 Lock 命令 ,发送 0x03 0x07 0x17 0x80 0x00 0x00 + 2字节CRC

完成配置区域的锁定,就可以写入16个 slot 数据了
在这里插入图片描述
这里不加密些的话直接使用 0x12 命令即可,若要使用加密写,则需要先发送 Nonce 与 Gendig, 生成值保存于 TempKey 中

Nonce Command

在这里插入图片描述
在这里插入图片描述
Nonce 发送 0x03 0x1B 0x16 0x00 0x00 0x00 + 20个随机数 + 2字节CRC
此时芯片会返回 32 字节,按上图就行 SHA-256 计算,得出存储在芯片内部的 TempKey 值。

GenDig Command

下一步则是发送 GenDig ,GenDig 命令使用 SHA-256 将存储的值与 TempKey 的内容组合起来。
在这里插入图片描述
在这里插入图片描述
GenDig 发送 0x03 0x07 0x15 0x00 0x00 0x00 + 2字节CRC
初次加密写,此处使用 config 中的 slot0,芯片返回 0 则成功,通过上图红框计算出新的值,同时该值也会由芯片计算,存储 TempKey 中。

Write Command

在这里插入图片描述
加密发送之前,需要先计算出 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 来进行加密读写。

Read Command

在这里插入图片描述
在这里插入图片描述
例如:读取未加密 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 Command

在这里插入图片描述

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 值有关。

DeriveKey Command

在这里插入图片描述
该命令主要进行密钥的滚动或者创建新密钥,要使用它,需要在配置 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

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值