1、认证流程:
(1)主机(Host)生成256位摘要(挑战),发送给ATSHA204芯片(Client),进行挑战;
(2)ATSHA204芯片使用HASH算法将摘要信息和自己的密钥进行计算,得到响应1;
(3)同时,主机使用HASH算法将该摘要信息和自己的密钥进行计算,得到响应2;
(4)主机将响应1和响应2进行比较,如果匹配,则认证成功。
2、RAM:存储输入命令和输出结果; EEPROM:包括数据区、配置区和OTP(一次性编程)区域。
3、(1)数据(data)区:数据区的总大小是512 Kb,包含16个通用的容量为32字节的数据槽,这些数据槽可用来存储秘钥、校准数据以及型号信息。
(2)配置(config)区:配置区的大小为88字节,配置区包含芯片的序列号、ID信息以及每个数据槽的访问权限信息,写入数据槽中的数据将参与后续的MAC运算。
(3)一次性编程(OTP)区:大小为64字节,在锁定OTP区域之前,可以通过写命令对OTP区域进行写入操作,OTP中存放的密钥也将作为SHA-256输入。
4、(1)序列号(serial number)用于区分其他芯片;
(2)内置16*32字节的slot(EEPROM)可以存储用户数据和秘钥;
(3)SHA算法(本文使用SHA256)最主要的特点就是,任意长度的输入能生成固定长度的输出,并且从输出的结果中不能还原输入的内容,而且要找到不同两个输入导致相同输出的情况在计算上不能实现;
(4)在单线上并没有传送秘钥,而是传送根据秘钥和一些列的值计算出来的digest,因此在单线上截获秘钥不可实现;
(5)在自己的MCU上也存了秘钥,别人获取了16进制文件后是否有可能得到秘钥,我只能说,的确存了,但是对于一个庞大的程序hex文件中寻找一个32字节的秘钥,岂不是大海捞针?
(6)CheckMAC命令也是带有验证功能的,简单来讲,就是让你计算好digest,发给ATSHA204A,然后ATSHA204A告诉你这个digest算的对不对,返回bool值;
(7)当我们原有的秘钥泄露的时候,可以使用DeriveKey命令来产生新的秘钥继续使用。
5、重要命令:
DerriveKey:更新一个slot区中的秘钥命令;
Nonce:使用随机数来更新TempKey中的值;
CheckMAC:验证一个摘要是否计算正确,返回的是Bool值类型(0是正确,1是错误);
MAC:使用SHA-256计算并返回一个摘要;
Read:读取芯片区域中的数据;
Write:写入芯片区域中的数据(这个命令一般用在配置时)。
6、防程序拷贝:
首先我们在ATSHA204A芯片的slot0中写入一个32字节的秘钥,设置为不可读。这个秘钥只有几个人知道,并且不外泄,主控MCU与芯片相连,在启动时候,首先我们要获取芯片序列号,为后面计算MAC。然后我们发送一个nonce命令给ATSHA204A,让其更新内部的TempKey中的值,MCU内部也根据nonce的模式计算一下Tempkey的值,我们称之为host_tempkey,如果一切正常,那么Tempkey和host_tempkey中的值是一致的,接下来MCU自己就可以根据host_tempkey、序列号、以及秘钥计算,出一个摘要digest,我们称之为digest1,接下来给ATSHA204A发送MAC命令,ATSHA204A根据存储在slot区域中的秘钥来计算digest2并返回给MCU,MCU判断digest1和digest2是否匹配,不匹配将程序挂起即可。