ATSHA204芯片手册阅读笔记

使用心得:
(1)配置好IIC,访问芯片之前先唤醒。
(2)按个人需求配置好Config区域,配置好之后锁住Config。只有锁住了Config,才能去操作Data区。
(3)开始写数据区,可以将一些自己觉得重要的数据写到数据区,写完之后,锁住才能读。
    关于ATSHA204的库文件,Atmel会更新,内容可能会不一样,下面的链接是我在2021/12/07在Github上下载的,本人用的也是这个库文件:
https://pan.baidu.com/s/148GmFoX_r940jYtDje85ng
密码:10af
    关于怎么使用这个库文件,可以向下拉看文章结尾处。

1 简介

1.1 芯片介绍和应用

ATSHA204A是Atmel公司的加密认证芯片。
基于硬件,具有受保护的密钥存储的加密元件
安全对称身份验证设备主机和客户端操作
具有消息身份验证码(MAC)的高级SHA-256哈希算法
具有唯一的72位序列号
具有内部高质量的随机数产生器(RNG)
具有4.5Kb的EEPROM,用于存储密钥和数据
具有512位OTP(一次性可编程)用于保存固定信息
可以使用IIC接口,也可以使用单串口。
可应用于如下场景:
    *安全下载和boot
    *系统控制
    *反克隆
    *消息加密
    该芯片有灵活的命令,用户可以通过命令将芯片设置成不同的功能,可以应用于:
(1)防伪
    验证可移动、可更换或可消费的客户端的身份,还可用于验证软件或者内存存储元件。
(2)保护固件程序
    验证boot启动时存储在闪存中的代码,以防止未经授权的修改(这也称为安全启动);加密下载的媒体文件;并对代码映像进行唯一加密,使其仅在单个系统上可用。
(3)交换会话密钥
    安全方便地交换加密密钥,供MCU处理器使用,以管理机密通信通道、加密下载和类似项目。
(4)安全保存数据
    在标准微处理器中存储加密加速器使用的密钥。可以用来存储配置、校准、过程值、消耗数据或者校准所需的少量数据和其他密钥。通过加密、认证读写保护实现可编程保护。
(5)检查用户密码
    验证用户输入的密码而不让期望值被人知道,将简单密码映射到复杂密码,并与远程系统安全地交换密码值。

1.2 设备特性

    ATSHA204A设备包含一个电可擦除可编程只读存储器(EEPROM),可用于密钥存储、读/写数据、只读、保密数据、消耗记录和安全配置。可以通过多种方式限制对内存各个部分的访问,然后可以锁定配置以防更改。ATSHA204具有广泛的防御机制,专门设计用于防止对设备本身的物理攻击或对设备与系统之间传输数据的逻辑攻击(说白了就是防止别人抄板子)。
    可以使用标准I2 C总线(高达1Mb/s的速度)访问芯片。
    每个ATSHA204A都附带一个保证唯一的9字节(72位)序列号。使用芯片支持的加密协议,主机系统或远程服务器可以证明序列号是真实的,而不是副本(反克隆)。序列号通常存储在标准的串行EEPROM中,可以很容易地复制,主机无法知道序列号是真实的还是克隆的,必须使用整个序列号来保证唯一性。
    ATSHA204A可以生成高质量的随机数,并将其用于任何目的,包括作为该设备加密协议的一部分。由于每个32字节(256位)随机数不依赖于此设备或任何其他设备上生成的过去的数字,因此将其包含在协议计算中可确保重播攻击(即重新传输以前成功的事务)无计可施。

1.3 加密操作

    ATSHA204A支持标准随机数响应协议,以简化编程。在其最基本的安装中,主机系统向客户机中的设备发送随机数,芯片通过使用来自系统的消息认证码(MAC)命令将该随机数与密钥相结合,并将该MAC命令响应发送回MCU。该芯片使用加密哈希算法进行组合(也称为摘要)。散列算法的使用可以防止别人在通讯总线上导出密钥的值,同时允许接收者通过执行相同的计算来验证响应是否正确,该计算将随机数与密钥相结合,以使用存储的密钥副本创建摘要。
    由于ATSHA204A的灵活命令集,对芯片的基本操作可以以多种方式扩展。通过使用GenDig命令,使其他SLOT(Slot可以理解为一个32字节的存储单元)中的值可以包含在响应摘要中,这提供了一种有效的方法来证明读取的数据确实来自设备,而不是由中间人攻击者插入。该命令可用于将两个密钥与随机数组合在一起,这在需要执行多层身份验证时非常有用。
    DeriveKey命令,实施密钥滚动方案。例如,根据命令模式参数,产生的操作可能类似于遥控车库门开启器中实现的操作。每次使用密钥时,密钥的当前值将以加密方式与特定于该系统的值组合,然后该结果将形成下一次加密操作的密钥。即使攻击者获得一个密钥的值,该密钥在下次使用时也将永远消失。
    DeriveKey还可用于生成新的随机密钥,这些密钥可能仅对特定主机ID、特定时间段或某些其他限制条件有效。每个生成的密钥都不同于任何设备上生成的任何其他密钥。通过以这种方式在字段中“激活”主机-客户端,单个客户端的克隆将无法在任何其他主机上工作。
    在主机-客户端配置中,主机(如移动电话)需要验证客户端(如OEM电池),需要将密钥存储在主机中,以验证客户机的响应。CheckMac命令允许主机设备安全地存储客户端的机密,并从SDA引脚上隐藏正确的响应值,仅向微控制器返回是/否答案。
    在需要用户输入密码的情况下,CheckMac命令还提供了一种方法,既可以验证密码而不在通信总线上公开密码,也可以将密码映射到具有更高熵的存储值。
    最后,随机数和密钥的散列组合(即摘要)可以保存在芯片上,并与Slot的内容异或以实现加密读取,或者可以与加密输入数据异或以实现加密写入。通过在计算中包含随机nonce(32字节),可以保护这些操作免受重放攻击。
    所有安全功能均使用行业标准SHA-256安全哈希算法实现,ATSHA204A使用的是256位密钥,以防止任何类型的穷举攻击。

2.芯片内部结构

设备包含下面的两个内存区:
    *EEPROM
    *SRAM

2.1 EEPROM结构

EEPROM总共包含664字节(5312位),分为以下几个区域:
>Data区(512字节)
    一个512字节(4Kbit)的区域,分为16个32字节(256位)的通用、只读或读/写内存Slot,每个Slot可用于存储钥匙、校准数据、型号或与ATSHA204A设备所连接项目相关的其他信息。根据存储在配置区域中的值,每个Slot可能具有不同的访问限制。
>Configuration(88字节)
    一个88字节(704位)的区域,包含序列号和其他ID信息以及数据存储器每个Slot的访问权限信息。88字节可从三块地址空间中访问
>OTP(一次性可编程)区(64字节)
    一个64字节(512位)区域,可用于存储只读数据或单向(保险丝类型)消耗记录信息。在锁定OTP区域之前,可以使用标准写入命令自由写入位。OTP区域可从两块地址空间内访问。在本文件中,术语OTP[bb]表示OTP区域内的一个字节,而OTP[aa:bb]表示一个字节范围。
    在锁定设备的配置和/或数据部分之前,必须使用所需内容覆盖此数据。

2.1.1 Data Zone

    数据区为512字节(4Kbit),是EEPROM阵列的一部分,可用于安全存储目的。在使用lock(Config)锁定配置之前,数据区域是不可访问的,既不能读取也不能写入。配置锁定后,可以使用Write命令写入整个数据区域。如果需要,可以对要写入的数据进行加密。

2.1.2 Configuration Zone

    配置区中的88字节(704位)包含数据区内Slot的访问权限配置。这88字节的值始终可以使用Read命令获得。该区域的字节排列如表所示。
在这里插入图片描述
    这个表格比较重要,从表格中我们可以知道配置区中有序列号,修订码,I2C相关,CheckMac配置,OTP模式,选择模式,并且有对应数据区的Slot配置信息,还有其他一些配置信息等等。这0x15个字的内容都是可以读取访问的。

2.1.2.1 I2C Enable

    如果Bit0为0,设备使用的是单串;否则使用的是IIC接口。

2.1.2.2 I2C Address

(1)如果设备是工作在IIC模式下,忽视掉Bit0,Bit1-7是I2C地址,如果Bit0为1,我们可以把它看作是I2C的读(设备地址|0x01)
(2)如果设备是工作在单串模式下,那么Bit3为TTL的使能,为1代表输入电平使用Vcc作参考。

2.1.2.3 CheckMacConfig

    这个字节仅仅使用于命令CheckMac,Read,和Write:
(1)Read和Write情况下:
    位0控制Slot0、1,位1控制Slot2、3,依此类推。如果TempKey.SourceFlag与此字节中的相应位不匹配,则任何加密的读/写命令都将失败。对于明文读取和写入,忽略此字节。
(2)CheckMac情况下:
    位0控制Slot1,位1控制Slot3,依此类推。仅当与目标Slot对应的CheckMacSource值与CheckMac命令的模式位2的值匹配时,才会启用复制功能。如果模式位2与TempKey.SourceFlag不匹配,则该命令将失败。因此这相当于要求该字节中的相应位与TempKey.SourceFlag匹配。

2.1.2.4 OTP Mode

    0xAA(只读模式)=当OTP区域被锁定时,将禁用写入,并允许读取所有字。
    0x55(消耗模式)=OTP区域锁定时写入OTP区域将导致位仅从1转换为零。允许阅读所有字。
    0x00(传统模式)=当OTP区域被锁定时,写入被禁用,字0和1的读取以及32字节读取被禁用。
    所有其他模式均保留。

2.1.2.5 Selector Mode

    如果为0,则选择器将更新为UpdateExtra。

2.1.2.6 SlotConfig

    总共有16个Slot,每个Slot对应一个Slot Config。Slot Config用于配置Slot的读写方式。下面是SlotConfig每个位的意义:
在这里插入图片描述
浅析下上面的表格:
Bit0-3:用于加密读取的密钥Slot,值可以是0-15,恰好16个Slot。如果为0,则此Slot可以用作CheckMac Copy命令。
Bit4: 如果为0,代表这个Slot可以用于所有加密命令;如果为1,代表这个Slot能用于CheckMac和GenDig命令
Bit5: 如果为0,没有限制钥匙的使用次数;如果为1,根据Slot的UseFlag(或LastKeyUse)限制可以使用密钥 的次数。
Bit6: 如果为0,允许明文读;如果为1,要求Slot是加密的,加密读取才能访问。
Bit7: 如果为0,Slot不是加密的,允许明文读取、明文写入、无MAC检查和无Derivekey命令。如果为1,Slot是加密的,允许加密读写。
    除非WriteConfig为“始终”,否则要启用正确的芯片操作,必须设置此位。设置该位为1的Slot,禁止4字节访问。用于存储密钥的Slot应始终将IsSecret设置为1,将EncryptRead设置为0(禁止读取),以获得最大的安全性。对于固定密钥,WriteConfig应设置为“从不”。以这种方式配置时,数据区域锁定后无法读取或写入密钥。它只能用于加密操作。
Bit8-11: 4个位,用于验证加密写入的密钥Slot
Bit12-15: 4个位,具体看下面的表格:
(1)执行DeriveKey命令情况下:
在这里插入图片描述
(2)执行写命令情况下:
在这里插入图片描述注意:上面的表格会重叠。例如,0110表示可以使用Write命令以加密形式写Slot,并且该SLOT也可以是未经授权的DeriveKey命令的目标。

2.1.2.7 Use Flag

    用于“一次性Slot”。“1”位的数量表示Slot0到7在被禁用之前可以使用的次数

2.1.2.8 Update Count

    指示Slot0到7已使用DeriveKey更新了多少次(所以我们这里可以知道DeriveKey命令是更新Slot内容)。

2.1.2.9 Last Key Use

    用于控制slot15的有限使用,也即是说上面表格的16个Last Key Use都是给Slot15使用的,Slot15的有限使用次数最大为16*8 = 128。每个“1”位表示Slot15的剩余使用。仅当设置了SlotConfig.SingleUse单次使用时适用

2.1.2.10 UserExtra

    为了通用系统使用,可以通过UpdateExtra命令修改。

2.1.2.11 Selector

    选择执行Pause命令后将保持活动模式的设备

2.1.2.12 Lock Data

    0x55:表示数据和OTP区未上锁,可以写访问。
    0x00:表示数据和OTP区上锁。只能根据相应的WriteConfig字段修改数据区中的Slot。OTP区域只能根据OTP模式进行修改。

2.1.2.13 Lock Config

    0x55:表示配置区拥有写访问(未上锁)。
    0x00:表示配置区失去写访问(上锁)。

2.1.2.14 配置区的特殊内存值(Bytes 0-12)

    ATSHA204A中包含各种固定信息,这些信息在任何情况下都无法写入,并且始终可以读取,而不管锁位的状态如何。
SerialNum
    9个字节的序列号(SN[0:8]),形成一个唯一的值,加密身份验证系列中的任何设备不可能存在相同的序列号,序列号分为两组:
1.SN[0:1]和SN[8]
    在大多数版本的ATSHA204A中,这些位的值在制造时是固定的。其默认值为(0x01 0x23 0xEE)。这24位始终包含在ATSHA204A进行的SHA-256计算中.
2.SN[2:7]
    这些位的值在制造过程中由Atmel编程,每个芯片的值都不同。这些6字节(48位)可选地包括在ATSHA204A进行的一些SHA-256计算中。
RevNum
    Atmel用于提供制造版本信息的4字节信息。这些字节可以自由读取为RevNum[0:3],但系统软件不应使用这些字节,因为它们可能会不时变化。(小编不知道这里啥意思,为啥可能,试了好几次没变化)

2.1.3 OTP区

    64字节(512位)的OTP区域是EEPROM阵列的一部分,可用于只读存储。在锁定配置部分(使用lockConfig)之前,OTP区域是不可访问的,既不能读取也不能写入。在配置锁定之后,但在锁定OTP区域之前(使用lockData),可以使用Write命令写入整个OTP区域。如果需要,可以对要写入的数据进行加密。OTP未上锁是无法读取OTP区域。
    锁定OTP区域后,配置区域中的OTPmode字节将控制此区域的权限。

2.1.4 设备锁

设备两个独立的锁字节:
    配置区的锁和数据及OTP的锁。
(上面的两把锁都放在配置区里面,通过Lock命令修改锁的值。内存区一旦锁上,无法解锁。)
    在应用芯片时,根据需求对设备进行个性化配置,并锁定配置区域。此锁定完成后,应使用写入命令(允许的话,可以加密写入)将所有必要的公共和机密信息写入EEPROM Slot。完成对数据和OTP区域的写入后,应锁定数据和OTP区域。
    在锁定配置节之前读取或写入数据或OTP节的操作都会导致芯片返回错误。

2.1.4.1 配置区上锁

    无论LockConfig的状态如何,都无法修改配置区域中的某些字节,比如前面说到的序列号和修订号码。看下面的图(Table2-7),使用配置区域中的LockConfig字节控制对区域内剩余字节的访问。如果LockConfig为0x55,则表示配置区域未上锁;否则它是锁定状态。
在这里插入图片描述

2.1.4.2 数据区及OTP上锁

在这里插入图片描述

2.2静态RAM

2.2.1TempKey

    TempKey是SRAM阵列中的一个存储寄存器,可用于存储来自Nonce、GenDig、CheckMac或SHA命令。该寄存器的内容永远无法被微控制器读取(只有芯片本身可以内部读取和使用该TempKey)
在这里插入图片描述
    在应用中,我们说的“TempKey”指的是32字节(256位)数据寄存器的内容。其余的位字段称为TempKey.SourceFlag,TempKey.GenData等等。
TempKey在以下的几种情况下是无效的:
*上电,睡眠,断电,看门狗溢出,篡改检测。(空闲模式下TempKey的内容是保留的)。
*无论命令执行是否成功,执行除Nonce或GenDig以外的任何命令后。除非成功复制,否则可通过CheckMac命令清除。如果存在通信问题,则不会清除,比如循环冗余校验(CRC)错误。
*分析或执行GenDig和/或Nonce命令时出错。
*GenDig的执行将会使用其输出替换Nonce命令的输出。Nonce命令的执行同样会替换GenDig命令以前的任何输出。

3 安全特性

3.1 物理加密

    主要介绍了内存的硬件加密。

3.2 RNG

    ATSHA204A包括向主控制器返回32字节随机数的高质量RNG。该芯片将生成的数字与单独的输入数字组合,以形成一个nonce,该nonce存储在设备中的TempKey中,可供后续命令使用。系统可将此RNG用于任何目的。一个常见的用途是在单独的加密身份验证设备上作为MAC命令的输入随机数。该芯片为此目的提供了一个特殊的随机命令,该命令不会影响内部存储的nonce。
    为了简化系统测试,在锁定配置区域之前,RNG始终返回以下值:ff ff 00 ff 00…其中ff是从设备读取的第一个字节,用于SHA消息。我们可以在应用中用逻辑分析仪抓取波形验证。
    为了防止对传递给ATSHA204A或从ATSHA204A传递来的加密数据的重播攻击,芯片要求在用于保护正在读取或写入的数据的加密序列中包含一个新的内部生成的nonce。为实现此要求,GenDig生成(并由Read或Write命令使用)的数据保护密钥必须使用内部RNG,所以Gendig命令的输入参数没有随机数,而是SlotID。
    随机数由硬件RNG的输出和内部种子值的组合生成,外部MCU无法访问该值。内部种子存储在EEPROM中,通常在每次通电或睡眠/唤醒循环后更新一次。更新后,该种子值保留在设备内的SRAM寄存器中,如果设备进入睡眠模式或电源断开,该寄存器将失效。

4 通用I/O信息

4.1 字节和位排序

CryptoAuthentication对字节以及数据表中数字和数组的表示方式使用通用的排序方案:
所有多字节聚合单元都被视为字节数组,并按照索引#0首先接收或发送的顺序进行处理。
2字节(16位)整数,典型的Param2,低字节优先传输在总线上。

5 I2C接口

· 通信速度<1Mhz
· 唤醒的条件是SDA维持60us以上的低电平,这里我直接将IIC总线的频率设置成100KHZ,然后发送字节0x00,低电平超过了60us就会被唤醒,唤醒之后延迟2.5ms就可以开始通讯了。
在IIC写过程中,第一个字节是写信号,第二个字节是Word Address Values,Word Address Values如下表所示:
在这里插入图片描述
    看起来也就4个word address value有用到,前面3个都很简单,但是后面的Command功能就多了,我们配置芯片和读写操作都是通过这个Command展开的,后面会讲到。

5.1 I2C同步

    系统可能会失去与ATSHA204A上I/O端口的同步,例如,由于系统复位、I/O噪声或某些其他情况。在这种情况下,ATSHA204A可能没有按预期响应,可能处于休眠状态,或者可能在系统预期发送数据的时间间隔内发送数据。当系统和设备失去同步时,I/O缓冲区中的任何命令都可能丢失,这时就需要同步芯片的I2C接口了。下面是I2C同步步骤:
(1).发送IIC起始信号
(2).发送九个时钟周期的SDA_H(总线上会返回NACK)
(3).重新发送IIC起始信号
(4).发送IIC停止信号
(5).尝试发送读信号,同步成功的话是会返回ACK的
(6).如果(5)有ACK,那么就发送Reset(Word Address Values)给芯片,以强制忽略可能已发送的任何部分输入命令。如果(5)接收到的是NACK,那么芯片可能进入睡眠模式,此时需要先将设备唤醒;如果芯片仍然没有相应,那么它就是在执行命令,此情况下需要等待tEXEC,再发送读信号给芯片,芯片会有应答的。

6 安全命令

这一小节讲解的命令都是使用Word address value = Command展开的,总线的写命令格式是这样子的:

ByteName
IIC_address_Write写信号
Command字地址值0x03
Count数据包字节长度(包含Count,Data,Checksum)
N Data如果命令有参数的话,非空
ChecksumCRC-16,多项式为0x8005

6.1 Status/Error Codes

芯片是没有状态寄存器的,但是输出FIFO能返回一些状态码代表芯片的工作状态。状态有:
在这里插入图片描述

6.2 命令排序

6.2.1 命令打包

在这里插入图片描述

6.2.2 命令操作码和执行时间

    注意,在使用芯片的过程中,命令的执行时间也是值得关心的,当你在执行完一条命令后,到从机的响应这段期间就是命令的执行时间,在这段时间内尝试读,会无响应(NACK)。
在这里插入图片描述
    后面我们会来学习上面涉及到的命令。在学习这些命令之前,我们先来了解区编码和地址编码。

6.2.3 区编码

    命令数据帧中,我们使用参数1来指定命令访问的是哪一个区,如下图所示:
在这里插入图片描述
    可以看到,(1)配置区任何时候都能读访问。未上锁时,部分内存支持写。在上锁或者加密后是写禁止的。
(3)OTP区在未上锁时不允许读,锁上之后能读,除了遗留模式。当配置区未上锁不允许写;当配置区上锁数据区不上锁支持写。
(4)Data区未上锁是不能读的,锁上之后根据IsSecret和EncryptRead进行读操作。当配置区未上锁不允许写;当配置区上锁数据区未上锁支持写操作;当数据区上锁之后写访问通过WriteConfig位控制。

6.2.4 地址编码

    命令数据帧中,我们使用参数2来指定命令访问的是区的哪个字地址,如下图所示
在这里插入图片描述
在这里插入图片描述
    可以看到,Data有16个块;Config有3个块;OTP有2个块,每个块32字节,即8个字,因此偏移offset占3个位。
下面我们就开始了解指令吧。

6.2.5 CheckMac Command

    CheckMac命令计算和生成MAC响应,并将内部MAC响应与外部输入的Digest进行比较,返回一个布尔结果。
在运行此命令之前,可以选择运行Nonce和/或GenDig命令,以在TempKey中创建和加载Key或Nonce值。
输入参数格式:
在这里插入图片描述
参数1:Mode:bit0决定“key”(SHA消息的前32字节)的源;
       Mode:bit1决定“challenge/nonce”(SHA消息的第二个32字节)的源。
       Mode:bit2,如果TempKey被使用,这个位必须与TempKey.SourceFlag的值匹配。
       Mode:bit3-4:0。
       Mode:bit5,SHA消息中的8字节,0:Zeros;1:OTP区。
       Mode:bit6-7:0。
参数2:SlotID: bit0:3用于指定哪个内部Slot用作响应产生。
数据1:微控制器给的随机数,32字节
数据2:微控制器的响应,32字节,这里的响应最终是要跟CheckMac命令产生的内部响应做比较的。
数据3:其他数据,目的是构造一条SHA-256消息,该消息将与MAC消息完全匹配,通过比较MAC命令的SHA-256所使用的消息,其他数据可以定义为如下:
在这里插入图片描述
    输出参数:返回1个字节,0代表相应与芯片内部计算出的摘要匹配;1代表不匹配。
    如果TempKey是计算值的一部分,Mode:bit2控制对随机nonce的要求。如果bit2为1,则必须使用Nonce(固定)生成TempKey;如果为零,则必须使用Nonce(随机)生成TempKey。
如果比较结果匹配,则可以将目标Slot值复制到TempKey中。如果SlotID为偶数,则目标Slot为SlotID+1,否则目标插槽为SlotID。要进行复制,必须满足以下条件。如果它们不是全部为真,则ATSHA204A将返回比较结果,但不会复制Key值。
1.CheckMac的Mode参数的值必须为0x01或0x05。
2.目标Key的SlotConfig.ReadKey必须为零。
3.与Slot对应的Config.CheckMacSource的值必须与Mode:bit2匹配。
CheckMac命令执行流程大致是:
TempKey与Slot或者随机数组合,然后加入Sha认证,认证会生成一个摘要,将摘要与微处理器发送过来的响应进行匹对,相同输出0,不相同输出1

6.2.6 DeriveKey命令

前面说到这个命令是用来更新Slot内容的,先来看看该命令的输入参数格式:
在这里插入图片描述
    命令执行之后将会返回1个有效字节,表示命令执行成功与否,为0x00表示成功。

    芯片组合key的当前值和存储在TempKey中的Nonce,然后将结果存放在目标key Slot里面。注意,SlotConfig[目标Key].Bit13必须为1,不然DeriveKey将返回错误。
    如果SlotConfig[目标Key].Bit12为0,即将与TempKey组合的源Key是命令行中指定的目标Key;如果SlotConfig[目标Key].Bit12为1,源Key就是目标Key的Parent Key(这里我译为上级Key),上级Key可以SlotConfig[目标Key].WriteKey中找到。
在执行DeriveKey命令之前,必须先运行Nonce命令以在TempKey中创建有效的Nonce。根据输入模式第二位的状态,该nonce可能是使用内部RNG创建的,也可能是固定。
若SlotConfig[TargetKey].Bit15为1,则必须存在输入MAC,即命令中的Data不能少。
如果SlotConfig[TargetKey].Bit12或者Bit15为1,并且SlotConfig[ParentKey].SingleUse为1,那么在UseFlag[ParentKey]为0的情况下命令最终将返回错误。如果SlotConfig[TargetKey].Bit12和Bit15都0的话DeriveKey命令忽视目标Key的SingleUse和UseFlag。
    注意该命令只对Slot0到7有效

6.5.7 DevRev命令

    DevRev命令返回四个字节表示设备版本号。它可能会时不时更改。该指令比较简单,输入参数格式如下:
在这里插入图片描述
成功执行之后会返回四个有效字节。

6.5.8 GenDig命令

    GenDig命令使用SHA-256将存储值与TempKey的内容组合在一起,TempKey的内容必须在执行此命令之前有效。存储值可以来自其中一个数据Slot、OTP页、配置区域的前两个页或从硬件传输密钥数组检索。生成的摘要保留在TempKey中,可按以下三种方式之一使用:
1.它(结果)可以作为MAC、CheckMac或HMAC命令使用的消息的一部分。由于MAC响应输出包含GenDig计算中使用的数据和来自MAC命令的密钥,因此它用于验证存储在数据和/或OTP区域中的数据。
2.后续读或写命令可以使用该摘要为数据提供身份验证和加密,在这种情况下,它又被称为数据保护摘要。
3.通过使用传输密钥数组中的值,此命令可用于安全个性化。生成的数据保护摘要可以被Write命令使用。
先来看看该命令的输入参数格式:
在这里插入图片描述
参数1:选择存储值的区,可以是Data、Config或者OTP。
    0x00,选择的是Config区,根据参数2(SlotID)来决定选择配置区的 哪一块数据作为组合对象,只能选择第0块和第1块。
    0x01,选择的是OTP区,根据参数2(SlotID)来决定选择第0/1块数 据作为组合对象。
    0x02,选择的是Data区,根据参数2(SlotID)来决定组合对象是来自 Data区的某个Slot还是来自硬件阵列传输密钥。
注意:SlotID<=15时,GenDig命令会将TempKey.GenData置1,并且 TempKey.SlotID = SlotID(参数2)。
参数2:指定使用哪个密钥,或者选择哪个OTP块。
Data: 如果使用CheckOnly Key那么这里应该为SHA运算填上4个字节。否则 忽视。
不管计算的结果摘要如何,我们都不能读的到。TempKey.Valid如果是无效(0),命令执行失败返回Error;如果是有效(1),那么摘要已经存放到TempKey中。
    如果命令执行成功返回1个有效字节表示成功状态,0表示成功。

6.5.9 HMAC命令

    HMAC命令计算存储在芯片中的密钥的HMAC/SHA-256摘要、随机数和其他信息。
正常使用步骤:
1.运行Nonce命令加载输入随机数,并可以选择将其与生成的随机数组合。此操作的结果是芯片内部Tempkey存储一个nonce。
2.可选地运行GenDig命令,将设备中的一个或多个存储值与nonce组合。结果存储在设备内部。
3.运行此HMAC命令,将步骤1(和步骤2,如果需要)的输出与EEPROM Key组合,以生成输出响应。
输入参数格式如下:
在这里插入图片描述
参数1:Mode决定哪个区用于消息中。该字节描述如下:
在这里插入图片描述
    HMAC命令执行成功的话返回32个有效字节(HMAC摘要)。

6.5.10 Lock命令

    Lock命令用于将配置区和Data(OTP)区上锁。如果已经上锁了再执行这条命令会返回错误。
输入参数格式如下:
在这里插入图片描述
    一般我们只需配置参数1的Bit0,和参数2,指定了哪个区,区里边的哪个,不过我用的时候是把Param2直接设置成0。
执行成功返回0。

6.5.11 MAC命令

    MAC命令计算存储在设备中的密钥的SHA-256摘要、随机数以及设备上的其他信息。此命令的输出是此消息的摘要。
正常使用步骤:
  1.运行Nonce命令加载输入随机数,并可以选择将其与生成的随机数组合。此操作的结果是设备内部存储一个nonce。
  2.可选地运行GenDig命令,将设备中的一个或多个存储值与nonce组合。结果存储在设备内部。
  3.运行此MAC命令,将步骤1(和步骤2,如果需要)的输出与EEPROM Key组合,以生成输出响应。
输入参数格式如下:
在这里插入图片描述
    其中的参数1(Mode)的定义如下:在这里插入图片描述
    其中注意Bit2,如果bit0或是bit1为1,表示数值取于Tempkey,那么bit2就要匹配Tempkey.sourceflag位,前面使用了Nonce命令的话,如果nonce命令中的nonce.mode等于0或者1,这里就等于0,如果nonce.mode等于3,这里就等于1.
    命令执行完成将会返回32字节(SHA-256摘要)。

6.5.12 Nonce命令

    这条命令很常用,Nonce命令通过将内部生成的随机数与来自系统的输入值相结合,生成一个Nonce,供后续GenDig、MAC、HMAC、Read或Write命令使用。生成的nonce存储在TempKey内部,生成的随机数返回给系统。输入值旨在防止针对主机的重播攻击,必须由系统从外部生成,并使用此命令传递到设备中。它可以是任何持续变化的值,例如非易失性计数器、当前实时时间等;也可以是外部生成的随机数。
    为随后的加密命令提供nonce值,输入码和输出随机数散列(are hashed)在一起。结果摘要(nonce)始终存储在TempKey寄存器TempKey中。TempKey.Valid置1、TempKey.SourceFlag清0使内部产生随机数。
  或者,如果后续命令需要固定的nonce,则此命令也可以在传递模式下运行。在这种情况下,输入值必须为32字节长,并且直接传递给TempKey而无需修改。
输入参数格式如下:
在这里插入图片描述
    在此再贴出Mode参数的定义表格:
在这里插入图片描述
    可以从Mode的表格中看出Bit0:1为0代表内部随机数和传入芯片的Numln数据组合生成一个nonce存储在TempKey中,在随机数产生之前自动更新EEPROM种子;为1代表内部随机数和传入芯片的Numln数据组合生成一个nonce存储在TempKey中,使用EEPROM中已存在的种子生成随机数,不更新EEPROM种子;为2无效;为3工作在旁路模式下,直接使用传入芯片的值写入到TempKey。
值得注意的是命令中的Data有20个字节或者是32个字节长度,那么怎么确定命令中Data的长度呢?如果Mode[Bit0:1]为0或者1,那么Data为20个字节的随机数,为3则是32字节。另外为3命令执行结果只返回1个字节,否则返回的是32字节(随机数)。

6.5.13 Random命令

    顾名思义,该命令用来产生随机数的。
    随机数是通过硬件RNG的输出和存储在EEPROM或SRAM中的内部种子值的组合生成的。外部系统可选择在生成随机数之前更新内部存储的EEPROM种子值。生成的随机数可以作为nonce或random命令执行的一部分,为了最高安全性,Atmel建议始终更新EEPROM种子。
下面是输入参数格式:
在这里插入图片描述
    Mode设置为0可以确保更新EEPROM随机数种子,一般我们就设置为0。
    命令执行成功返回32字节的随机数。

6.5.15 Read命令

    该命令用的频率非常高,如果读取SlotConfig.EncryptRead为1的对应Slot,那么在执行这条命令之前必须先执行GenDig命令获取加密使用的Key。SlotConfig.ReadKey中指定的密钥必须已在GenDig计算中使用。
    该设备通过将从EEPROM读取的每个字节与TempKey中相应的字节进行异或来加密要读取的数据。不允许对配置和OTP区域进行加密读取。
    对于Data,如果数据区未上锁,Read命令返回Error;否则,根据SlotConfig来对Slot进行读访问。如果SlotConfig.IsSecret置1和尝试读四字节,最终只会返回Error。如果EncrytRead置1,Read命令按指定方式加密数据。如果IsSecret置1并且EncryptRead为0,命令执行结果Error;如果IsSecret为0并且EncryptRead为0,命令返回的是明文的Slot数据。
    对于Config,数据允许在任何情况下读取。
    对于OTP,如果OTP区未上锁,不能读。一旦锁上,并且OTP模式没设置成Legacy,所有的字都能被读取;如果OTP模式设置成Legacy,只允许四字节读,读取地址0或者1将返回错误。
下面是该命令的输入参数格式:
在这里插入图片描述
    上面的表格理解起来也简单,再看看数据区的读操作中涉及到的一个重要的表格:
在这里插入图片描述
    如果要读取的Slot号是偶数,那么TempKey.SourceFlag必须为Rand(随机数);如果Slot号为奇数,TempKey.SourceFlag必须与相应Slot的Config.CheckMacSource匹配。内存区的数据异或上TempKey的值就能返回明文。
这里参考8981文档,简单说一下标准的加密读取流程:
(1)运行一次Random命令获取高质量随机数;
(2)运行一次Nonce命令,将第一步的随机数作为输入参数使用,mode=1,执行后更新TempKey;
(3)MCU使用相同的Nonce函数算出ATSHA204中的TempKey,并返回32字节的随机数(Randout);
(4)运行一次Gendig命令,传参中的SlotID是读取密钥的ID号,ID号等于想读的Slot的ReadKey,比如我想读Slot5的内容,但是我们先前就将Slot5配置成加密读取的,密钥是存在Slot3(也就是Readkey);
(5)MCU使用相同的Gendig函数算出Tempkey的值;
(6)接下来就使用Read命令,指定读取的Slot,返回32字节,这32字节是密文的;
(7)将读取到32字节与TempKey异或,这样就得到了Slot里面的明文数据。
上面讲到的Nonce函数和Gendig函数是Atmel提供的,可以在官网上下载得到,函数在help.c里面。

6.5.16 Write命令

    Write命令将一个4字节的字或一个32字节的8字块写入设备上的一个EEPROM区域。根据此Slot的WriteConfig字节的值,微控制器可能需要在将数据发送到设备之前对其进行加密。
    对于Data,如果配置区域已锁定且数据区域未上锁,则所有区域中的所有字节都可以使用纯文本或加密数据写入,使用32字节方式写入。锁定数据区域后,WriteConfig字节中的值控制对数据Slot的访问。如果此Slot的WriteConfig位设置为“始终”,则输入数据应以明文方式传递给设备。如果SlotConfig的位:14设置为1,则应加密输入数据并计算输入MAC。
    对于Config,如果配置区域已锁定或Zone:6为1,则此命令返回错误;否则,将按请求写入字节。
    对于OTP,如果OTP区域已解锁,则可以使用此命令写入所有字节。如果OTP区域被锁定,且OTPmode字节为只读或Legacy(遗留),则此命令返回错误;否则,OTP模式为消耗模式,此命令将OTP区域中与输入参数值中的零位对应的位设置为零。当OTP区域被锁定时,无论OTP模式如何,都不允许对其进行加密写入。
输入参数格式如下:
在这里插入图片描述
如果满足以下四个条件,则仅允许在数据和OTP区域中进行四字节写入:
     *SlotConfig.IsSecret必须为0
     *SlotConfig.WriteConfig必须为Always
    *输入数据必须是没加密的
    *Data/OTP区必须上锁
在其他情况下,四字节写将会返回错误。
命令上面的Address格式可以参考前面的Address编码,如果是32位的写忽略Address[0:2]。
命令执行成功返回0。

6.5.17 SHA命令

    SHA命令计算供系统通用的SHA-256摘要。可以容纳任何消息长度。MCU负责发送最后一个块的pad和length字节。
可以通过下面两个步骤生成一个摘要:
1.初始化
    通过使用初始化常量覆盖TempKey的当前值来设置SHA-256计算单元。强制TempKey标志与Nonce(Fixed)命令后的状态匹配。此模式不接受任何消息字节。
2.计算
    在这种模式下,可以多次调用该命令以向消息中添加字节。此模式的每次迭代必须包含64字节的消息。输出缓冲区始终包含摘要,如果需要,可以忽略摘要。摘要也会加载到TempKey中。
    先执行初始化再执行计算。微控制器可以根据需要运行任意多个SHA(Compute)命令来计算所需摘要。如果在“Init”迭代和最后一次“Compute”迭代之间运行SHA以外的任何命令,则返回错误。如果模式字节的值不是0或1,则该命令还返回分析错误。
    如果设备处于睡眠状态或看门狗计时器过期,则存储在TempKey中的中间摘要将无效。系统软件必须确保在单个唤醒/看门狗间隔期间将整个消息发送至设备。
下面是该命令的输入参数格式:
在这里插入图片描述
    应用SHA需要调用该命令两次,一次是初始化,一次是运算。
    初始化成功返回0,计算摘要成功返回32字节的SHA-256摘要。

7 库文件的使用

解压之后会有两个文件夹:
sha204_library文件夹和sha204_helper文件夹
sha204_library文件夹目录内容如下:
在这里插入图片描述
    其中arch文件夹里面存的是IIC的驱动和延时的驱动,平台不一样,我们可能需要修改它们。
    sha204_comm.c文件主要是提供CRC计算检查,芯片的唤醒和收发函数API,不是底层。
    sha204_comm_marshaling.c有命令执行函数,我们所有的命令都是通过调用里面的一个函数执行的。

uint8_t sha204m_execute(uint8_t op_code, uint8_t param1, uint16_t param2,
			uint8_t datalen1, uint8_t *data1, uint8_t datalen2, uint8_t *data2, uint8_t datalen3, uint8_t *data3,
			uint8_t tx_size, uint8_t *tx_buffer, uint8_t rx_size, uint8_t *rx_buffer)

    其中的传参tx_size和rx_size其实不起作用,函数会根据命令来决定tx_size和rx_size是多大,我们需要做的是tx_buffer和rx_buffer指向的缓存足够就可以,40个字节应该就够了。
    sha204_i2c.c文件就是调用底层IIC驱动对芯片进行访问,比如进入空闲模式,进入睡眠模式,复位IO等等。
sha204_helper文件目录如下:
在这里插入图片描述
    我们可以利用sha204_helper.c文件里面提供的函数算出芯片内部的TempKey等数据,实现对称加密。

8 总结

    关于ATSHA204的了解就到这。
    在应用的过程,笔者使用的是AtmelSamE70Q21做主控,使用TWI接口实现与ATsha204芯片的通讯,过程中出现点小问题就是不能读取TWI_SR寄存器里面的NACK位来判断从机有没有响应,导致我读ATSHA204命令执行响应需要中间靠延时来确保在执行时间之后正常读取执行结果数据。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值