ATSHA204a加密芯片在TG401上的移植配置与使用

来源:互联网 发布:下线推广 源码 编辑:程序博客网 时间:2024/06/05 19:45


经过几天的探索,终于把ATSHA204a移植到TG_401的开发板上,完成了软件的加密。

刚接触到atsha204a脑子里一堆问题,首先通信用i2c,地址是多少?它的加密原理是什么,什么是密匙?如何写进去?如何互通信息.......

1、下面我用简介通俗的语言说一下atsha204a的加密原理:

首先我们要对atsha204a进行配置,写密匙,设置为不可读写,锁定。这样芯片里的密匙就只有你自己知道了。配置完成后接下来就是使用了,在你的程序启动时首先初始化完i2c就开始与atsha204a通信,验证密匙。你在程序里随机生成32字节的随机数作为挑战码发送给ATSHA204 芯片。ATSHA204 芯片会使用芯片内的 SN[0:1], SN[8], 你指定的某个slot区的ID(KeyID),此slot区的数据,接收到的挑战码,KeyID , MAC 命令码和mode使用SHA256算法作一次哈希运算, 输出一组 32 字的Digest, 并传回给主 MCU,同时MCU也根据上述数据通过官方库里带的SHA256算法计算出自己的Digest然后与ATSHA204 芯片返回的Digest进行比较,如果完全一样则通过,不一样则密匙验证失败。由于你每次发送的挑战码是随机生成的,所以每次校验码也是不一样的,别人也就无法拷贝你的程序了。

下面是官网库的下载地址:

http://www.atmel.com/tools/CRYPTOAUTHENTICATIONATSHA204DEVELOPMENTLIBRARY.aspx

官方库下载下来后是有问题的,缺少文件,直接移植到自己的工程里会有一堆错误。库下载下来后第一步要做的就是调通i2c,可以用以下函数来检测

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

);

atsha204a的默认i2c地址是0xC8。(设备地址是0x64,左移一位后最后一位是0代表写操作,是1代表读操作,这是i2c的知识。当初在此处我还跳了个坑)。与芯片通信前要注意需要将芯片唤醒,即SDA线保持低电平60us,芯片即可退出休眠状态,然后再等待2.5ms后,才能开始接受命令。

2、接下来说一下读写命令格式:

发送数据包格式:

1byte

1byte

Nbyte

2byte

WordAddress

Count

Data

CRC(LSB:MSB)

接收数据包格式:

1byte

Nbyte

2byte

Count

Data

CRC(LSB:MSB)

count是数据包的长度,包括count本身,data和CRC16。

data是数据内容。

CRC16是数据包的校验码,校验内容从count到data。


发送数据时库函数sha204m_execute会把数据打包好。接收到数据后可以使用uint8_t sha204c_check_crc(uint8_t *response) 函数对接收到的数据进行校验。

 

 

第一个字节是操作码,Read command 的操作码是0x02, Write command 的操作码是0x12

第二个字节的最高位bit7指示是读写32字节还是4字节,1为读写32字节。bit0-1指示读写哪个区,0:Config区,1:OTP区,2:Data区。 

第三个字节是Address地址。

3、进行配置前要注意:

1.芯片的config区和data区锁定后,不能解锁,锁的方法通过lock command来进行锁定。 如下图,此处的Lock Data和Lock Config的默认值为0X55,当data区config区锁定后就会变为0x00。

 

2.在config区锁定前,data区既不能写也不能读。而在config区锁定后,data区锁定前,data区只能写不能读,在data区锁定后,可以根据config中的配置来进行读写,使用。

Config区的配置:

 

如上图所示,如果i2c总线上挂载了多个atsha204a芯片,则需要对i2c地址进行重写(如图地址0x04的第一个字节)。如果只是为了软件加密一般只对slot区配置即可地址0x05--0x0C。每个slot区的配置占用2个字节。具体配置看下图:

 

 

 

bit0-3:如果某个slot区被指定为可加密读,则这里指定存放加密读取所需密钥的slot。
bit4:0:这个slot区可以用于所有加密命令,1:这个slot只能用于GenDig命令和CheckMac命令。 
bit5:一般为0表示此slot中存放的密钥可以无限使用。
bit6 : 0: 允许明文读取,1:必须加密读取。 
bit7:0:此slot不是密钥区,可以随意读写,1:此slot作为密钥区,如果能读写则必须是加密进行

bit8-11:如果某个slot区被指定为可加密写,则这里指定加密写的密钥存放的slot 
bit12-15 :对于DeriveKey Command:设置生成的新的密钥要通过什么途径来获取,

对于Write Command:
bit15 = 0;bit14 = 0;bit13 =0; 随意写 
bit15 = x;bit14 = 0;bit13 =1; 不能写 
bit15 = 1;bit14 = 0;bit13 =x; 不能写 
bit15 = x;bit14 = 1;bit13 =x; 加密写

配置完后使用lock command来进行锁定config区,读取0x15,返回值Lock config 对应的值由0x55变为0x00,表示成功锁定。

4、写入密匙:

接下来就可以往slot里写数据。

 

上图是data区的地址,把数据写进去后使用lock command来进行锁定data区,读取0x15,返回值Lock data对应的值由0x55变为0x00,表示成功锁定。

5、接下来使用MAC命令验证密匙:

 


mode.bit0设置使用Tempkey计算还是直接使用Data中的挑战码来计算返回的digest。 

mode.bit1设置使用slot区中的值计算还是Tempkey中的值来计算返回的digest。 
mode.bit2如果bit0或bit2设置了,那么此位要结合Tempkey.sourceflag位设置。也就是说,使用了nonce命令的话,如果nonce命令中的nonce.mode == 0x00 或者0x01,这里就等于0, 如果nonce.mode == 0x03,这里就等于1。 
mode.bit3 = 0 
mode.bit4和mode.bit5 是选择是否使用OTP中的的值来参与计算。
mode.bit6是使用序列号来参与计算。 
mode.bit7 = 0

发送过去后,如果执行正常,会返回一个32字节的digest,同时MCU也根据上述数据通过官方库里带的SHA256算法计算出自己的Digest然后与ATSHA204 芯片返回的Digest进行比较,如果完全一样则通过,不一样则密匙验证失败。



1 0
原创粉丝点击