1. 加密芯片的功能和基本原理.
加密芯片主要用来保护烧进Flash里面的程序即使被盗版者读走, 在非法板上也不能运行, 从而达到保护自己劳动成果的目的.
本文主要内容:
一. 加密芯片的工作原理
二. DVS项目中配置区的寄存器配置
三. 接口描述
四. DES和自定义算法.
一. 加密芯片的工作原理.
1. 硬件连接
AT88SC0104C的封装外型和内部结构模块图如下:
AAAAAAAAAAAAAAAAAA
不能拷图~~~~~~
AAAAAAAAAAAAAAAAAA
连接好电源和地后, 将SDA和SCL与主控HOST的GPIO连接好就可以了.
2. AT88的工作模式和工作机制
AT88SC的工作模式有三种, 标准, 认证和加密三种模式, 标准模式下可以将该芯片视为一个常用的EEPROM来访问. 不过访问时序要按招它自己的Write/Read User Zone命令来读写数据. 认证模式则要复杂的多, 讨论认证模式之前要先研究下这个加密芯片的算法F2.
F2算法的输入是一个系统产生的随机数Q0, 还有从加密芯片0x50,0x60,x070,x080位置读出来的8个字节的密文Ci和一个种子Gc, 芯片内部一共四组用户访问区, 因此对应着四组访问寄存器AR和密码寄存器PR, 以及四组密码寄存器CryptogramCi和四组密文种子Gc.
它的输出是一个八位的新密文Q1, 主机在调用F2时生成Q1, 同时将Q0和Q1用Verify Authentication命令送给AT88, AT88收到认证命令后内部根据保存在密文区的Ci值和种子Gc做同样的运算生成Q2, 同时生成一个密钥Sk, 然后Q2与Q1作对比, 如果结果一直说明认证成功, 它用Q2更换掉密文区的Ci, 同时生成新的密文更新Session Encryption Key配置区.
第三中模式是加密模式, 它是在认证的基础上在利用Sk替代Gc再做一次F2运算, 并将结果用Verify Encryption命令送给AT88,如果这次运算成功, 芯片内部会启动加密机制, 对总线上传输的数据进行加密\解密.
3. 访问用户数据区.
以AT88SC0104为例, 它的数据存储区分成四个分区, 每个数据区有32字节容量. 大小为4*32=128B=1028b
先看用户区相关的几个配置寄存器
AR: 访问寄存器,
PM1 |
PM0 |
AM1 |
AM0 |
ER |
WLM |
MDF |
PGO |
Bit7 |
Bit0 |
PM1-PM0: 用来设置用户区的读写是否需要密码.
AM1-AM0:用来设置用户区的访问是否需要认证.
ER,WLM,WDF, PGO请参考NDA文档
PR:
AK1 |
AK0 |
POK1 |
POK0 |
res |
PW2 |
PW1 |
PW0 |
Bit7 |
Bit0 |
AK1-AK0:选择四个种子中的一个作为认证的输入.
POK1-POK0:双向认证时使用
PW2-PW0:选择8套密码之一作为验证密码.
设置好AR寄存器后就可以通过下面的命令步骤来对用户区读写.
1. SetUserZone
2. 如果需要认证加密启动认证命令
3. 读写数据
4. 发送checksum
具体可以参考我的代码.
二. DVS项目中AT88SC0104的配置.
加密芯片的使用阶段包含三个阶段.
1.开发阶段
这个阶段主要用来调试代码, 这个时候要非常注意不要随便的访问某些寄存器, 因为超过某些次数寄存器如AAC, PAC的计数次数之后, 这个片子会被锁死, 这样unlock配置区会失败. 所以调试时要非常小心..
DVS项目中主要用ATSC88来进行认证, 我把所有的种子都设成一个值, AR0-3 PR0-3也设成一样, 这样就可以用一个种子访问整个128字节空间.
AR PR分别设成认证不需要密码模式, 见下面的代码
data[0]=0xDF;//ARnormal authentication, encrypted required
data[1]=0x23;//PR
cm_WriteConfigZone(0x20, data, 2, 0);
data[1]=0x63;//
cm_WriteConfigZone(0x22, data, 2, 0);
data[1]=0xa3;//
cm_WriteConfigZone(0x24, data, 2, 0);
data[1]=0xe3;//
cm_WriteConfigZone(0x26, data, 2, 0);
NC设成0xff 0xff 0xff 0xff 0x00 0x00 0x00然后每出厂一个NC值加一.
其它比如Ci Sk等寄存器可以用默认值, 因为在芯片工作起来之后它们时动态变化的.
DCR寄存器要用它的默认值0xFF, 对访问出错次数进行限制. 但是在调试阶段可以设成0x0F.
最重要的一个寄存器时种子Gc, 它是根据Nc用自定义的算法和一个密钥运算得出的, 这组寄存器对于整个加密芯片非常关键, 因为熔断后它是不可读的, 只能通过自定义算法算出.
2. 熔断阶段
完成上边的配置后就可以用熔断命令对芯片进行熔断操作. ****这里要非常注意一定要确认自定义算法是否唯一能够算出Gc.*****
3. 出厂阶段.
做好熔断后就可以将加密芯片焊到板上了.
三. 接口描述.
对于应用层, 只能看到下面四个接口:
int SE_Load_Data(int zone, puchar data, uchar len);
int SE_Save_Data(int zone, puchar data, uchar len);
int SE_Auth_Done()
int SE_Auth_Init();
int SE_Auth_Init();
这个函数主要完成硬件GPIO的初始化, 并且对AT88SC的时序和类型进行测试.
int SE_Auth_Done()
这是个认证函数, 每调用一次, 主机会发起一次加密认证操作.
int SE_Load_Data(int zone, puchar data, uchar len);
int SE_Save_Data(int zone, puchar data, uchar len);
这两个函数时用来读写用户区数据, 他采用的时加密认证, 没有密码, 对时序加密.
四. 自定义算法
void des_GcCal(uchar *Ncc, uchar *Key, uchar *dataO);
这是DES算法的变种, 它的输入是Ncc---从芯片内部读出的卡号.
Key---加密密钥, 这组数据用来对Ncc加密, 整个DVS项目采用一个相同的私钥来加密所有Ncc. 这样得到的dataO就是种子Gc.
这个算法可以公开, 但是Key需要保密. 后记: 其实这里面有很多东西我没有弄清楚的, 比如AR寄存器里面有个ER位的用法, 我把它设成0之后就出现问题了,
还有AM1-AM0都为00时的双向认证模式. 调试这颗芯片要特别小心, 不然很容易把它锁死废掉了.