ATECC508A芯片开发笔记(九):加密读写数据的流程及相应设置
Contents
Encrypted Read.
1.1 Standard Encrypted Read Flow.
1.2 Simple Encrypted Read Flow Diagram.
2. Encrypted Write.
2.1 Standard Encrypted Write Flow.
2.2 Simple Encrypted Writes Flow.
3. Device Organization:Zones、Terms.
3.1 EEPROM Data Zone.
3.2 EEPROM Configuration Zone.
3.3 SlotConfig when Data Zone is locked.
Read Permissions.
3.4 KeyConfig.
1.Encrypted Read
1.1 Standard Encrypted Read Flow
Figure1:Standard Encrypted Read Flow Diagram
如上图所示为508A等Atmel CryptoAuthentication 系列设备Encrypted Read实现过程,其步骤大体如下:
(1)Host(MCU)首先生成Nonce命令所用参数,填充eccX08h_nonce_in_out结构体中的Mode、NumIn两个参数(输入),之后执行eccX08h_nonce()(既发送Nonce命令包);
(2)508A接受到指令,先通过Opcode判断是Nonce命令,然后根据Nonce传来的Mode、NumIn参数(例如图中所示为Random模式,会根据NumIn并结合内部RNG生成一个随机数计算出Digest),利用SHA-256算出结果(Digest),并将该Digest保存在TempKey的Value数组中,最后将RandOut(生成的随机数)返回;
(3)MCU接受到508A内部产生的随机数,同样利用SHA-256结合发送的Nonce参数,算出该Nonce的实际值,既存储在508A 中TempKey的Digest。Nonce命令执行完毕
(4)MCU 执行eccX08h_gen_dig(),函数将发送GenDig命令,508A接受到该命令后,通过opcode判断出是GenDig,然后根据第二个参数Zone=0x02(Data),表示此时KeyID表示数据区的一个Slot或一个硬件阵列中存储的密钥;
然后读取第三个参数KeyID,为待读取Slot中的值,然后根据后续的24位串号数据(SN[0:1] SN[8] 默认值均为0x01 23 EE)以及Nonce命令执行后TempKey的Value值(上一步生成的Digest),综合以上数据,利用SHA-256算出新的TempKey,此时TempKey的Value就是会话密钥Session Key。
Zone = Data时GenDig参数格式:
(5)在MCU发送GenDig到508的同时,MCU本身也利用上述参数,以及之前算出的Nonce实际值(Digest),利用SHA-256算出Session Key。
(6)MCU通过eccX08h_decrypt()函数发送Read命令,508A接受到命令后,通过opcode判断是Read命令,之后得到Zone=Data = 0x82(10000010),根据Read命令知道,该Zone值是指以32Byte的方式读取Data区;然后的参数是Address,对应待读取的Slot或Block。
(7)解析完Read命令后,508A将对应Address中的明文数据(Plain Text)利用GenDig生成的Session Key加密成密文,然后将该密文返回至MCU/HOST,最后MCU利用计算的Session Key将该密文解密成需要的明文。(具体读取方式是通过XOR换算)
1.2 Simple Encrypted Read Flow Diagram
加密读模式简易版:
与标准加密读在Nonce阶段有所不同,其使用Nonce的Pass-through模式,由MCU生成Nonce值,直接作为NumIn发送到508中,省略了508A通过Nonce计算返回随机数,MCU根据随机数再计算Nonce值的过程。其余步骤基本一致。
2.Encrypted Write
2.1 Standard Encrypted Write Flow
加密写数据的前几个步骤与加密读是一样的,都是两方先产生Nonce,然后通过GenDi*生Session Key,不同的是由MCU对要写入的数据通过Session key进行加密,然后通过Write命令发送到508A中:
(1)完成之前一系列Nonce、GenDig命令后,MCU首先使用算出的Session Key加密 Plain text,得到密文cipher text,然后通过eccX08h_encrypt()函数,根据输入的 address、要传输的Plaint text以及GenDig生成的SessionKey等参数,使用SHA计算出Host MAC(既数字摘要);
(2) MCU封装好Write命令参数结构体 ,向508发送Write命令。508收到命令包后通过第二个参数Zone = 0x82(10000010)知道是对 Data区写入,并且输入的数据是加密后的密文,然后在Write第三个参数Address得到要写入哪个Slot/Block,然后从 Data_1、Data_2分别得到密文以及Host MAC。
(3)对于得到的密文cipher text,508使用上面GenDig命令产生的由508内部算出的Session key将 密文解密成明文Plain text,之后同样根据Session key、Address、Plain text等参数使用SHA计算出 Client MAC。
(4)将传入的Host MAC与508计算出的Client MAC进行比较,如果相等,则将解密后的Plain text写入到508相应的Address中,完成加密写操作,返回Success;否则返回error。
2.2 Simple Encrypted Writes Flow
2.2
同样是简易版的加密写,与简易加密读是一个原理,都是在Nonce命令上使用Pass-Through模式,由MCU生成Nonce值,直接作为NumIn发送到508中,省略了508A通过Nonce计算返回随机数,MCU根据随机数再计算Nonce值的过程。其余步骤基本一致。
3.Device Organization:Zones、Terms
508A设备控制手册中关于数据存储空间的介绍
3.1 EEPROM Data Zone
Data Zone共有16个Slot,是用来存储密钥、Secret数据,其中0-7个Slot大小为36Byte,专门用于存储密钥信息,第8个slot是416 Byte,可存储比较大的Secret数据;第9-15 Slot大小为72Byte,专门用于存储证书、公钥、数字签名。
3.2 EEPROM Configuration Zone
Config Zone是用来配置、获取508A一些基本功能与参数,串号等固定数据也存在于ConfigZone,如是否使能IIC加密读写
3.3 SlotConfig when Data Zone is locked
SlotConfig配置DataZone中每一个Slot所存储的数据、以及相应的权限等,这里面详细的设定了每一个Slot需要存储哪一种Secret、是否支持加密读写、数据是否具有可读可写权限等。
其中ReadKey(0-3Bit)一栏,有多种可读权限选择,实际是否可读与IsSecret和EncryptedRead的设置都非常相关。。并且如果设置Slot存储的是ECC 私钥Private keys,则该Slot是永远不能被读取的。
必须使能EncryptedRead才能使用本章节所介绍的加密读写,否则与508芯片通信都是明文传输
注意只有DataZone Lock后这些配置才会生效。
3.4 KeyConfig
KeyConfig是配置每一个Slot中存储的Key相关参数,例如存储的是公钥还是私钥、KeyType属于ECC哪个曲线等。