文献标识码: A
文章编号: 0258-7998(2015)03-0028-03
中文引用格式:曹欲晓,韩冬,徐金宝.一种基于CPUID和AES算法的STM32固件升级方案[J].电子技术应用,2015,41(03):28-30+34
0 引言
STM32是ST公司推出的基于ARM Cortex-M3[1]内核的系列微控制器。STM32系列微控制器在Coretex-M3内核的基础上集成了丰富的外设单元[2],具有高性能、低功耗、低成本的优势,被广泛应用在工业控制、医疗和手持设备等众多领域中。与PC上的软件一样,嵌入式系统的固件(即软件)也需要不断升级。现在固件的升级一般是使用JTAG或SWD仿真器,通过专用软件完成,所有产品的升级使用相同的文件,因此易被非法用户盗版使用。
为了防止固件被盗版,文献[3]提出了一种使用硬件狗对单片机程序进行加密的方法,程序在运行过程中不断对硬件狗进行访问和读写,通过硬件狗的唯一性来保证加密后的固件不被非法访问和复制。文献[4]利用一种专用加密芯片AT88SA102S把单片机中的固件程序和加密芯片进行绑定,从而实现了对单片机程序的保护。文献[5]使用一种1-Wire安全器件,采用安全散列算法SHA-1对固件程序进行认证,防止对固件的非法拷贝。文献[6]提出了应用芯片唯一身份识别码、RC振荡器频率和上电标志进行软件加密的方法。
上述方法虽然能有效地保护单片机的应用程序,但是采用硬件器件加密的方法需要额外的硬件单元,提高了电路的复杂性和产品的成本;采用软件加密的方法,则需要对每一个芯片单独编译烧写加密后的应用程序,增加了产品批量生产时的工作量。
针对上述固件升级以及硬件和软件加密方案的不足,本文在分析了STM32系列微控制器结构特点的基础上,把STM32内部的全球唯一CPUID作为密钥,应用AES算法对STM32应用程序所在的bin文件进行加密,给不同的STM32芯片生成不同的升级bin文件。加密后的bin文件由STM32以自己的CPUID作为密钥解密,并通过IAP技术写入Flash,从而实现应用程序的合法升级完全由唯一的CPUID控制,只有合法的STM32芯片才能正确地升级固件,防止了非法用户对应用程序的拷贝复制。
1 CPUID和AES算法
1.1 STM32的CPUID
每一个STM32微控制器内部都有一个96位的全球唯一序列号,存储在地址0x1fff7a10-0x1fff7a18处,称为CPUID。这个CPUID是STM32芯片的身份标识[7],只能读出不能写入,任何两片STM32微控制器的CPUID都是不相同的,并且同一批次的STM32芯片的CPUID也毫无规律性,所以CPUID可以用来判断芯片的合法性以决定是否执行固件程序。
1.2 AES算法
AES(Advanced Encryption Standard)是NIST(美国国家标准技术研究所)用来代替DES算法的新一代数据加密标准。NIST要求AES 候选算法需满足以下基本要求:AES在体制上应是对称分组密码;密钥的长度可以是128 bit、 192 bit或 256 bit;数据分组的长度可以是128 bit、192 bit或256 bit;AES算法应容易在各种硬件平台和软件平台上实现。经过几轮筛选,最终由Joan Daemen和Vincent Rijmen设计的Rijndael算法在2000年10月成为AES标准的最终算法[8]。
AES算法是一种对称加密算法,加密和解密使用相同的密钥。AES算法的输入是固定长度的分组,输出分组的长度和输入分组相同,每一个分组和密钥的长度可以是128 bit、192 bit或256 bit,对应的加密轮数分别是10、12或14轮。取分组长度和密钥同为128 bit,给出AES算法加密和解密的流程如图1和图2所示[9]。
2 IAP技术
IAP(In Application Programing)[10]的意思是“在应用编程”,指CPU执行程序时,通过正在执行的程序完成对片内Flash的改写。利用IAP,可以在程序正常执行时向Flash写入新的数据或程序,克服了以往改写Flash需要停止程序运行的缺点。
通过IAP更新固件,新的固件可以来自串行口、USB、以太网等数据接口,也可以来自外接的TF卡。STM32在执行IAP操作时,首先对片内Flash解锁,接着擦除需要重新编程的Flash区域,最后把新的固件代码写入。使用IAP功能,需要有两个可执行程序,一个称为Bootloader,另一个称为App。Bootloader和App分别存储在Flash的不同区域,存储空间不能重合。Bootloader是启动引导程序,负责应用IAP改写App固件并跳转到App执行。App是正常工作时系统完成具体功能的应用程序。
3 基于CPUID和AES算法的STM32固件加密升级
3.1 系统架构和总体原理
本文提出的加密升级方案,一共需要三个组成部分:STM32系统、PC、服务器,系统架构如图3所示。STM32系统是需要升级的嵌入式系统。PC上运行一个升级控制程序,控制STM32的升级操作,并在STM32系统和服务器之间进行通信。服务器上存储有IAP升级用的原始bin文件和所有合法的STM32微控制器的CPUID,负责为每一个STM32生成不同的bin文件。STM32系统须具有一个USB从机接口,用来与PC连接;还要有一个接在SDIO接口上的TF卡,这个TF卡通过FatFS文件系统被模拟成一个U盘,使PC可以象操作普通U盘一样操作这个TF卡,STM32和PC的数据交换通过TF卡进行。TF卡初始化后在其中建立一个标记是否升级App的标志文件。
STM32升级固件时,把自己的CPUID加密后传给PC上的控制程序,由PC通过网络发给服务器。服务器事先保存了所有合法的CPUID,当收到PC送来的CPUID时,首先检查其合法性,如合法则用接收的CPUID作为密钥对原始bin文件进行AES加密,所以对不同的STM32能生成不同的升级用bin文件。如果其他STM32试图用自己的CPUID作密钥解密这个bin文件,则解密出的程序是错误的,不能执行。
STM32系统的Bootlaoder可以在硬件能正常工作后用仿真器统一烧写,第一个App可以直接应用本文提出的方法升级写入。
3.2 Bootloader的设计
Bootloader在完成自身的初始化后,检查TF卡上的写入标志文件的变化,如果同时具有写入标志和新的bin文件,则把bin文件读入内存,以自己的CPUID作密钥,应用AES算法解密bin文件,接着使用IAP把新的App写入Flash。新的App写入完成或者无需升级时,直接跳转到App执行。Bootloader的工作流程可用图4表示。
3.3 App的设计
App程序执行时,除完成正常工作外,每隔一定时间检查一次TF卡上的写入标志文件,如果发现PC上的控制程序改写了升级标志,则读出CPUID,用一个固定密钥经AES加密后写到TF卡上,通过这种方式把加密后的CPUID由PC传给了服务器。PC控制程序获得服务器返回的加密bin文件后,写到TF卡上。STM32重启后在Bootloader中完成App的固件升级。
4 STM32的IAP功能的实现
4.1 STM32的IAP
STM32有三种启动方式,具体采用哪种由STM32的BOOT0和BOOT1两个引脚的组合决定[11],只要BOOT0置低,无论BOOT1置高或置低,STM32都从内部Flash启动。STM32内部的Flash地址从0x8000000开始,Cortex-M3内核的Flash起始地址的第一个字(4 B)必须是栈顶指针的值,第二个字存放复位中断向量的地址,随后才是STM32要执行的代码。为了实现应用程序的IAP功能,STM32片内的Flash要分成两个区域,开始的一部分存储Bootloader,后面的一部分存储App。STM32启动时首先从0x8000000地址开始执行,即先执行Bootloader,在Bootloader中再跳转到App。
Bootloader中的IAP流程是:首先解锁Flash,擦除App占用的Flash块区;然后从TF卡中读出升级bin文件,应用AES算法解密;解密后的代码按顺序写入上一步擦除的Flash,全部App写入完成再对Flash加锁以防止被调试工具读出。
Bootloader通过IAP完成固件的写入后,执行以下代码完成到App的跳转[12]:
JumpAddress=*(__IO uint32_t*) (APPLICATION_
ADDRESS + 4);//取出App的中断向量地址
Jump_To_Application=(pFunction) JumpAddress;
//给函数指针赋值
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
//初始化用户堆栈指针
Jump_To_Application();//跳转到App执行
4.2 App代码的修改和开发环境的设置
因为App程序没有存储在Flash的起始地址,所以在App的main函数中要重新设置中断向量表的起始地址,否则会因为中断向量地址出错导致App不能正常运行。这可以通过调用STM32固件库中的函数NVIC_Set-
VectorTable来实现,该函数的第一个参数是Flash的起始地址,第二个参数是App在Flash中的偏移量。
通过IAP升级App使用的文件必须是bin格式,但编译器直接编译生成的是hex文件,因此还需要使用开发工具链中的工具把hex文件转换成bin文件,PC控制程序拷贝到TF卡中的就是服务器加密后的bin文件。
5 结语
STM32芯片内置的全球唯一96位ID可以作为芯片的身份认证标志,同时具有大容量的Flash,可以同时存储Bootloader和App,并支持IAP。STM32的这两个特点为使用AES算法加密生成不同的升级文件提供了物质基础。经过实际测试,把服务器为某一个STM32生成的加密bin文件拷贝到其他STM32系统后并正确改写升级标志,STM32系统重启后应用程序无法执行。应用二进制分析软件对不同STM32请求升级得到的bin文件进行对比,发现所有bin文件均不相同,因此本文提出的方法可以为不同的STM32生成唯一的升级文件,有效防止了非法用户的盗版行为。
参考文献
[1] ST Microelectronic Corporation.STM32F10x refrence manual[Z].2008.
[2] 黄智伟,王兵,朱卫华.STM32F 32位ARM微控制器应用设计与实践[M].北京:北京航空航天大学出版社,2014.
[3] 藤广超,郎建军,杜其才,等.基于STM32的硬件狗设计与实现[J].微处理机,2013(6):70-72.
[4] 张炜轩,王菲,王玉平.基于专用加密芯片的单片机加密系统设计[J].单片机与嵌入式系统,2013(9):56-59.
[5] 易威,彭亿强,罗森侨.基于1-Wire安全器件的单片机加密认证系统[J].电子科技,2013,26(7):180-182.
[6] 潘永雄,胡敏强,罗小伟.单片机控制程序加密策略探索与应用[J].计算机工程与设计,2010,31(11):2466-2469.
[7] ST Microelectronic Corporation.STM32F10xxx Cortex-M3 programming manual[Z].2008.
[8] NIST.Advanced encryption standard(AES)[S].Federal Infor-mation Processing Standards Publication,2001.
[9] 何明星,林昊.AES算法原理及其实现[J].计算机应用研究,2002(12):61-63.
[10] ST Microelectronic Corporation.STM32F10x in-application programming[Z].2008.
[11] ST Microelectronics Corporation.STM32F10x Flash prog-ramming[Z].2008.