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进行比较,如果完全一样则通过,不一样则密匙验证失败。
- ATSHA204a加密芯片在TG401上的移植配置与使用
- atsha204a加密芯片使用攻略——配置篇
- ATSHA204A加密芯片攻略——使用篇
- ATSHA204A加密芯片之--MAC校验代码
- DS1302芯片在am335xD上的移植
- 嵌入式实时操作系统μC/OS-Ⅱ 在DSP芯片上的移植与测试
- Live555在Amlogic系列芯片上的移植
- 具有代码移植专利技术的加密芯片
- 加密芯片算法移植方案的优点
- 自定义编程移植的加密芯片
- FreeRtos在RH850 D1L芯片上移植
- atsha204a加密ic01
- atsha204a加密ic02
- SSL 加密在Jrun上的配置
- DS1302时钟芯片在90c51上的使用
- minigui在海思解决方案(hi3515芯片)上的移植过程
- 16C2550串口芯片在at91sam9263板上的linux驱动移植
- minigui在海思解决方案(hi3515芯片)上的移植过程(有加个人修改)
- Java中的随机数Random
- html在目标对象后追加内容
- 几种激活函数的比较
- Java获取Process进程ID,并杀掉相应的进程树
- 常见数据库操作经验-数据库函数-删除索引
- ATSHA204a加密芯片在TG401上的移植配置与使用
- 简单的jsp页面
- Node.js 使用async模块
- 必须记住这几种庄家洗盘的形态
- 简易串口读取代码
- 几个零散的数学点
- MySQL 主从复制与读写分离概念及架构分析
- asp.net请求处理流程
- spring-创建 Bean 后置处理器