《电子技术应用》

一种基于CPUID和AES算法的STM32固件升级方案

2015年电子技术应用第3期
曹欲晓1,韩 冬2,徐金宝1
(1.南京工程学院 计算机工程学院,江苏 南京211167; 2.清华大学 自动化系,北京100084)
摘要: 针对STM32系统固件升级时使用同一个文件易被非法复制使用的缺陷,提出并实现了一种一个STM32芯片使用一个唯一升级文件的固件升级方案。升级固件时,由服务器为不同的STM32芯片生成不同的bin文件,该bin文件是以STM32的CPUID为密钥,应用AES算法加密原始bin文件得到的。升级时STM32以自身的CPUID作为密钥对文件解密,如果作为解密密钥的CPUID和作为加密密钥的CPUID不同,则解密出的bin文件不能运行。解密后,再应用IAP技术把新的bin文件写入Flash。实际测试证明,提出的方法可以实现“一片一密”,有效防止了升级程序的非法使用。
中图分类号: TP311
文献标识码: A
文章编号: 0258-7998(2015)03-0028-03
中文引用格式:曹欲晓,韩冬,徐金宝.一种基于CPUID和AES算法的STM32固件升级方案[J].电子技术应用,2015,41(03):28-30+34

A scheme of firmware upgrade of STM32 based on CPUID and AES algorithm

Cao Yuxiao1,Han Dong2,Xu Jinbao1
(1.School of Computer Engineering,Nanjing Institute of Technology,Nanjing 211167,China; 2.Department of Automation,Tsinghua University,Beijing 100084,China)
Abstract: For the shortage that the unique upgrade file is easy to be illegal used,a kind of firmware upgrade scheme is proposed and implemented,that one STM32 system uses one unique upgrade file. When upgrading firmware,the server generates different bin file for different STM32 system.The server uses AES algorithm to encrypt original bin file with every STM32′s CPUID as encryption key. STM32 decrypts the bin file with its CPUID as the key. If the CPUID as decryption key is not same as the CPUID as encryption key,the program decrypted by STM32 can′t run. After decryption STM32 uses IAP technology to write new firmware to Flash. The actual test proves that the method given by this paper can achieve "one chip one key" and prevent illegal use.

 

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是正常工作时系统完成具体功能的应用程序。

001.jpg

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的标志文件。

003.jpg

  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表示。

004.jpg

  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.


继续阅读>>