本文是概括篇,我会在我的资源那里上传代码,敬请后续关注,方便读者参考使用,如有疑问或者有业务合作,可私信我。
调试的平台:mt6580 系统:android5.1
加密芯片:ATSHA204A(8脚S0IC封装)
推荐:具有4.5kb eeprom,且性价比最高。
接口:Interface Type :Single-wire; I2C,推荐使用i2c接口,传输速率可达1Mb/s
I2C_Address:0x64 (由0xC8右移一位得到,至于为什么右移是因为这个驱动在寻址的时候会自动左移一位,详情可百度)
datasheet pdf文档可在下面的链接下载(如不能下载,建议拷贝网址到别的浏览器试下或者百度找一下或者找fae):
https://www.microchip.com/sitesearch/search/All/ATSHA204A
供电电压范围:2.0v~5.5v
通讯电压范围:1.8v~5.5v(io/i2c接口的电压范围)
休眠功耗:<150 nA
硬件连接:这个是ATSHA204A的SOIC封装,只需要电源,地,I2C的SCL和SDA这4根线即可,SCL和SDA需要上拉电阻
应用范围:
安全下载和引导
生态控制
反克隆
信息安全
关于烧录器这块:官网上也有卖,不过价格有点略贵,网上自己买或者自己做,主要还是iic写进去(所以也可以自己在驱动中添加代码I2C实现,强烈推荐在调试过程中使用I2C写入即可,可以省一笔钱,土豪随意)。
ATSHA204A的EEPROM总共包含664字节(5312位),并被划分为以下区域:Data,Configuration,One Time Programmable
Data包含512字节(4.0 kb)区域划分为16个32字节(256位)的通用只读或读/写存储器插槽,每个插槽可用于存储密钥、校准数据、型号或其他信息,通常与ATSHA204A设备所附加的项目相关。每个数据槽的访问策略由编程到相应配置值的值决定。但是,策略仅在设置锁值字节时生效,slot主要意图是存放密钥,当然也可以设置成eeprom来使用,但一般用户都不会这么做。
Configuration包含序列号和其他ID信息的88字节(704位)EEPROM区域,以及访问数据内存每个插槽的权限信息。在配置区域中编程的值决定了每个数据槽如何响应的访问策略。可以修改配置区域,直到锁定它为止(LockConfig设置为!=0x55)。为了启用访问策略,必须设置锁值字节。
OTP位的64字节(512位)区域。在锁定OTPzone,位可以使用标准的写命令自由地写。OTP区域可用于存储只读数据或单向保险丝类型的消耗日志记录信息
我这里使用的是I2C通讯,使用这个芯片可以分为三步,
第一步是调通I2C,实现加密IC跟mcu主控的通讯
1、唤醒加密ic:
对ATSHA204A操作时,首先要对设备进行唤醒操作,唤醒操作如下 :
SDA线保持低电平60us,芯片退出休眠状态,然后再等待2.5ms以上后,才能开始接受命令,详细说明在datasheet的第36页,见下表。
我这边的做法是直接向设备发送0x00数据等效于拉低SDA数据线电平然后隔4ms使用i2c读函数读取返回值。
2、i2C通讯数据格式:
说明:一般的加密芯片都有自己固定的指令包格式,如果格式不对,IC要么不响应,要么响应错误,所以在向芯片发包之前,需要了解一下数据包的格式。
ATSHA204A有固定的接收包和发送包的格式,主控MCU必须要按照固定的格式发送数据包过来,ATSHA204A才能返回正确的响应字节。
可以参考datasheet:8. Security Commands和8.5 Command Sequence(datasheet 44页),Command Opcodes的定义在datasheet 45页。Word Address Values定义在datasheet 31页
发送包结构:Command + Count 包的长度(不包括command,但包含本身的字节数)+ Opcode + Param1 + Param2 + Data + Checksum
接收包结构:count(byte:0)+Date-Packet(byte:1到N-1)+CRC两个字节的校验和(N-1到N)
注意:command对应就是WordAddress,对芯片的操作主要使用command,即0x03来操作,其他command如下表说明。
ATSHA204A的Opcode主要有以下这几种,见下表:
ATSHA204A的响应字节如下表所示(例如你写入字节成功,会返回0x00,其他返回状态见下表):
第二步是成功配置这个芯片。在config zone配置,配置完要锁定配置区
关于IC的锁定这块的说明:
1、芯片的config区和data区一旦锁定,没有办法解锁,锁的方法只能通过lock command来进行锁定。
2、config区在没锁定的时候,可以使用write command来进行写操作,但注意,0x00-0x03地址(word地址,详情请参考手册)不能被写,0x15word地址不能使用write command来写。
3、在config锁定前,data区(包括slot区和OTP区)既不能写也不能读。而在config锁定后,data区锁定前,data区只能写不能读,在data区锁定后,可以根据config中的配置来进行读写。
只有正确配置了config,atsha204a芯片才能按自己的意图办事(Configuration Zone的word adress定义和说明在datasheet的第10页,其实可以按照datasheet的默认配置值来配置使用)。
由表知道配置区地址0x00-0x03是一直不允许写的,只能读。
对于一般用户,0x04地址的4个配置按默认值设置即可(即配置成0xc8(atsha204a的i2C地址) 0x00 0x55 0x00)。
接下来是地址0x05-0x0C关于slot 的配置了,这里才是这节的重点,也是需要注意最多的地方。
每个slot config占用2个字节,每个位具体配置如下:
一位一位的说
bit0-3:指定加密读的slot区,这里的意思是,如果你把slotX设置成可以加密读取,则这里要指定加密读取的密钥存放的slot,简单来说,你要读一个slotX,而slot config[X]已经被配置成可以加密读,
但是需要知道slot config[X].ReadKey中指定的slot区的密钥。
bit4:0:这个slot区可以用于所有加密命令,1:这个slot只能用于CheckMac命令和GenDig命令。
bit5:0:此slot中存放的密钥可以无限使用,1:此slot存放的密钥有限使用,次数根据UseFlag或LastKeyFlag指定。
bit6:0: 可以明文读取,1:必须加密读取。
bit7:0: 此slot不是密钥区,可以随意读写,1: 此slot作为密钥区,如果能读写则必须是加密进行
bit8-bit11:指定加密写操作的slot区密钥,跟bit0-3类似,只不过这里是写操作,使用write command命令。
bit12-15对于DeriveKey Command 和 Write command命令有不同的意思,对于DeriveKey Command,就是决定生成的新的密钥要通过什么途径来获取(Target?,Parent?)
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; 加密写
Write Configuration Bits — Derivekey Command
bit15 = 0; bit14 = x; bit13 =1; bit12 =0;无需授权MAC (Roll)即可运行DeriveKey命令。
bit15 = 1; bit14 = x; bit13 =1; bit12 =0;为DeriveKey命令(Roll)授权MAC。
bit15 = 1; bit14 = x; bit13 =1; bit12 =1;为DeriveKey命令(创建)授权MAC。
bit15 = x; bit14 = x; bit13 =0; bit12 =x;WriteConfig字段中具有此值的槽不能用作DeriveKey命令的目标。
以下是我的一个模板,可以把slotX的值填进来,再对应说明来看,就知道是配置的哪种策略了”
bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
Lock Data 和Lock Config是控制锁定数据区和配置区的两个字节,
LockData = 0x55,data区没有锁定可以进行写操作。
LockData = 0x00,data区进行锁定,读写需要根据配置来进行。
LockConfig =0x55,config区没有锁定可以进行读写操作。
LockConfig = 0x00,config区不能写。
锁定config zone:Table 8-20 Input Parameters(datasheet 55页)
由Table 8-20表格可知,输入包数据结构:command+count+opcode+param1+param2+crc
Zone.bit0决定的是锁config还是OTP区,Zone.bit7 = 1,则不计算需要锁定区域的CRC16值,否则需要输入一个CRC16值来校验。
Summary如果Zone.bit7=0,那么就这里就需要填入相应锁定区域的CRC16值,否则填0x0000。
如果命令成功就返回0。
往data区写入数据:
此区的配置没那么复杂,slot主要意图是存放密钥,当然也可以设置成eeprom来使用,但一般用户都不会这么做。
slot区一共分16部分,slot0-15,每部分可以存放32字节密钥,相信足够使用。
对slot区的配置无外乎读写内容,在config区锁定前,所有对slot区的读写操作均返回错误。在config区锁定后,data区锁定前,只能写slot区而不能读取,在二者都锁定后,可以根据上节所讲的slot config
来进行读写。
假设我们配置完了config区,现在我们来写slot区,很简单,在data区锁定前可以随意读写,但强烈建议使用32字节来写操作,采用4字节写操作,会有很多的限制条件。
假如我们对slot0写入0x11,0x11,……0x11(共32个0x11),使用write command,参数如下(这里我们暂时先不考虑各种加密读写)。
command= 0x03(WordAddress);
count = 0x27(39 bytes)
opcode = 0x12(write);
zone = 0x80|0x02; (即0x82)//32字节写,写slot区;
address = 0x00 0x00(byte0=00,byte1=0x00(固定是0x00);
data_1 = 32个字节 0x11;
data_2 不填 ;
CRC = 0x00 0x00;
如果写入成功,atsha204a将会返回0。
接下来就是往opt写入数据,
OTP zone的说明Table 2-8. OTP Zone在datasheet的15页;
OTP区和slot区配置类似,在atsha204a里,OTP分16部分,每部分4字节,默认值都是0xffffffff,OTP区在config区锁定前无法进行任何读写操作,在config锁定后,data区锁定前,不能读,只能写,与slot区不同的是,OTP区并没有加密读写这一概念,另外也强烈建议使用32字节写,4字节写入会有很多限制,在data区锁定后,OTP区的读写操作由OTP Mode决定。
command:COMMAND_ADDRESS(0x03);
Input Parameters:
count = 0x27(39个byte);
Opcode:0x12(write);
Param1: 0x81(表示写入的是otp zone);
Param2:0x00 0x00(2 bytes address);
data(32 bytes) ;
CRC(0x00 0x00)
第三步是进行认证(即实现加密验证)
用通俗易懂的语言说一下atsha204a的加密原理:
首先我们要对atsha204a进行配置,写密匙,设置为不可读写,锁定。这样芯片里的密匙就只有你自己知道了。配置完成后接下来就是使用了,在你的程序启动时首先初始化完i2c就开始与atsha204a通信,验证密匙。你在程序里随机生成32字节的随机数作为挑战码发送给ATSHA204A 芯片。ATSHA204A 芯片会使用芯片内的 SN[0:1], SN[8], 还有你指定的某个slot区的ID(KeyID),此slot区的数据(32字节),接收到的挑战码,KeyID , MAC 命令码和mode使用SHA256算法作一次哈希运算, 输出一组 32 字的Digest, 并传回给主MCU,同时MCU也根据上述数据通过官方库里带的SHA256算法计算出自己的Digest然后与ATSHA204 芯片返回的Digest进行比较,如果完全一样则通过,不一样则密匙验证失败。由于你每次发送的挑战码是随机生成的,所以每次校验码也是不一样的,别人也就无法拷贝你的程序了。
最后说说我使用的加密方案:
(一)使用MAC命令验证密匙
MAC命令计算存储在设备中的key、一个挑战(0到32字节,一般是32 bytes)和设备上的其他信息的SHA-256摘要Digest。此命令的输出是此消息(例如挑战)的摘要Digest。如果消息中包含了设备的序列号,则表示响应是“多样化的”
使用此命令的一般命令流如下:
1、运行Nonce命令加载输入挑战(Chanllenge),并可选择将其与生成的随机数组合。该操作的结果是在tempkey中存储在设备内部的nonce。
2、可选地运行GenDig命令,将设备中存储的一个或多个EEPROM位置与nonce组合在一起。结果存储在tempkey中的设备内部。此功能允许将两个或多个密钥用作响应生成的一部分。
3、 运行这个MAC命令,将步骤1(如果需要,还可以将步骤2)的输出与EEPROM密钥结合起来,生成输出响应(或摘要)。
写入芯片的数据包格式输入参数可以根据Table 8-22 Input Parameters(datasheet 的56页),函数的执行可以参考库函数文件。
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.
使用SHA-256算法散列的message由以下内容组成(88 bytes):
包含有Chanllenge的数据包发送到加密芯片ATSHA204A后,如果执行正常,会返回一个32字节的digest(摘要)给到MCU主控端读取,同时MCU也根据上述数据(message)通过官方库函数文件里带的SHA256算法计算出自己的Digest,然后与ATSHA204 芯片返回的Digest进行比较,如果完全一样则密钥验证通过,不一样则密匙验证失败。
关于ATSHA204A还有很多加密的功能,篇幅有限,我就不一一介绍了,建议大家还是多看看datasheet,才能更好的领会这个加密IC的作用和使用。
---------- 爱生活,爱安卓,爱Linux ----------