曹欲曉,韓 冬,徐金寶
(1.南京工程學(xué)院 計算機(jī)工程學(xué)院,江蘇 南京211167;2.清華大學(xué) 自動化系,北京100084)
一種基于CPUID和AES算法的STM32固件升級方案
曹欲曉1,韓 冬2,徐金寶1
(1.南京工程學(xué)院 計算機(jī)工程學(xué)院,江蘇 南京211167;2.清華大學(xué) 自動化系,北京100084)
針對STM32系統(tǒng)固件升級時使用同一個文件易被非法復(fù)制使用的缺陷,提出并實現(xiàn)了一種一個STM32芯片使用一個唯一升級文件的固件升級方案。升級固件時,由服務(wù)器為不同的STM32芯片生成不同的bin文件,該bin文件是以STM32的CPUID為密鑰,應(yīng)用AES算法加密原始bin文件得到的。升級時STM32以自身的CPUID作為密鑰對文件解密,如果作為解密密鑰的CPUID和作為加密密鑰的CPUID不同,則解密出的bin文件不能運(yùn)行。解密后,再應(yīng)用IAP技術(shù)把新的bin文件寫入Flash。實際測試證明,提出的方法可以實現(xiàn)“一片一密”,有效防止了升級程序的非法使用。
STM32;CPUID;AES算法;加密;解密;在應(yīng)用編程
STM32是 ST公司推出的基于 ARM Cortex-M3[1]內(nèi)核的系列微控制器。STM32系列微控制器在Coretex-M3內(nèi)核的基礎(chǔ)上集成了豐富的外設(shè)單元[2],具有高性能、低功耗、低成本的優(yōu)勢,被廣泛應(yīng)用在工業(yè)控制、醫(yī)療和手持設(shè)備等眾多領(lǐng)域中。與PC上的軟件一樣,嵌入式系統(tǒng)的固件(即軟件)也需要不斷升級?,F(xiàn)在固件的升級一般是使用JTAG或SWD仿真器,通過專用軟件完成,所有產(chǎn)品的升級使用相同的文件,因此易被非法用戶盜版使用。
為了防止固件被盜版,文獻(xiàn)[3]提出了一種使用硬件狗對單片機(jī)程序進(jìn)行加密的方法,程序在運(yùn)行過程中不斷對硬件狗進(jìn)行訪問和讀寫,通過硬件狗的唯一性來保證加密后的固件不被非法訪問和復(fù)制。文獻(xiàn)[4]利用一種專用加密芯片AT88SA102S把單片機(jī)中的固件程序和加密芯片進(jìn)行綁定,從而實現(xiàn)了對單片機(jī)程序的保護(hù)。文獻(xiàn)[5]使用一種1-Wire安全器件,采用安全散列算法SHA-1對固件程序進(jìn)行認(rèn)證,防止對固件的非法拷貝。文獻(xiàn)[6]提出了應(yīng)用芯片唯一身份識別碼、RC振蕩器頻率和上電標(biāo)志進(jìn)行軟件加密的方法。
上述方法雖然能有效地保護(hù)單片機(jī)的應(yīng)用程序,但是采用硬件器件加密的方法需要額外的硬件單元,提高了電路的復(fù)雜性和產(chǎn)品的成本;采用軟件加密的方法,則需要對每一個芯片單獨編譯燒寫加密后的應(yīng)用程序,增加了產(chǎn)品批量生產(chǎn)時的工作量。
針對上述固件升級以及硬件和軟件加密方案的不足,本文在分析了STM32系列微控制器結(jié)構(gòu)特點的基礎(chǔ)上,把STM32內(nèi)部的全球唯一CPUID作為密鑰,應(yīng)用AES算法對STM32應(yīng)用程序所在的 bin文件進(jìn)行加密,給不同的STM32芯片生成不同的升級bin文件。加密后的bin文件由STM32以自己的CPUID作為密鑰解密,并通過IAP技術(shù)寫入Flash,從而實現(xiàn)應(yīng)用程序的合法升級完全由唯一的CPUID控制,只有合法的STM32芯片才能正確地升級固件,防止了非法用戶對應(yīng)用程序的拷貝復(fù)制。
1.1 STM32的CPUID
每一個STM32微控制器內(nèi)部都有一個96位的全球唯一序列號,存儲在地址 0x1fff7a10-0x1fff7a18處,稱為CPUID。這個 CPUID是 STM32芯片的身份標(biāo)識[7],只能讀出不能寫入,任何兩片STM32微控制器的CPUID都是不相同的,并且同一批次的STM32芯片的CPUID也毫無規(guī)律性,所以CPUID可以用來判斷芯片的合法性以決定是否執(zhí)行固件程序。
1.2 AES算法
AES(Advanced Encryption Standard)是 NIST(美國國家標(biāo)準(zhǔn)技術(shù)研究所)用來代替DES算法的新一代數(shù)據(jù)加密標(biāo)準(zhǔn)。NIST要求AES候選算法需滿足以下基本要求:AES在體制上應(yīng)是對稱分組密碼;密鑰的長度可以是128 bit、192 bit或256 bit;數(shù)據(jù)分組的長度可以是128 bit、192 bit或 256 bit;AES算法應(yīng)容易在各種硬件平臺和軟件平臺上實現(xiàn)。經(jīng)過幾輪篩選,最終由Joan Daemen和Vincent Rijmen設(shè)計的Rijndael算法在2000年10月成為AES標(biāo)準(zhǔn)的最終算法[8]。
AES算法是一種對稱加密算法,加密和解密使用相同的密鑰。AES算法的輸入是固定長度的分組,輸出分組的長度和輸入分組相同,每一個分組和密鑰的長度可以是128 bit、192 bit或256 bit,對應(yīng)的加密輪數(shù)分別是10、12或 14輪。取分組長度和密鑰同為 128 bit,給出AES算法加密和解密的流程如圖 1和圖 2所示[9]。
IAP(In Application Programing)[10]的意思是“在應(yīng)用編程”,指 CPU執(zhí)行程序時,通過正在執(zhí)行的程序完成對片內(nèi)Flash的改寫。利用IAP,可以在程序正常執(zhí)行時向Flash寫入新的數(shù)據(jù)或程序,克服了以往改寫 Flash需要停止程序運(yùn)行的缺點。
通過IAP更新固件,新的固件可以來自串行口、USB、以太網(wǎng)等數(shù)據(jù)接口,也可以來自外接的TF卡。STM32在執(zhí)行IAP操作時,首先對片內(nèi) Flash解鎖,接著擦除需要重新編程的 Flash區(qū)域,最后把新的固件代碼寫入。使用IAP功能,需要有兩個可執(zhí)行程序,一個稱為 Bootloader,另一個稱為App。Bootloader和 App分別存儲在 Flash的
圖1 AES算法加密流程
圖2 AES算法解密流程
不同區(qū)域,存儲空間不能重合。Bootloader是啟動引導(dǎo)程序,負(fù)責(zé)應(yīng)用IAP改寫App固件并跳轉(zhuǎn)到App執(zhí)行。App是正常工作時系統(tǒng)完成具體功能的應(yīng)用程序。
3.1 系統(tǒng)架構(gòu)和總體原理
本文提出的加密升級方案,一共需要三個組成部分:STM32系統(tǒng)、PC、服務(wù)器,系統(tǒng)架構(gòu)如圖3所示。STM32系統(tǒng)是需要升級的嵌入式系統(tǒng)。PC上運(yùn)行一個升級控制程序,控制STM32的升級操作,并在STM32系統(tǒng)和服務(wù)器之間進(jìn)行通信。服務(wù)器上存儲有IAP升級用的原始bin文件和所有合法的STM32微控制器的CPUID,負(fù)責(zé)為每一個 STM32生成不同的 bin文件。STM32系統(tǒng)須具有一個USB從機(jī)接口,用來與 PC連接;還要有一個接在SDIO接口上的TF卡,這個TF卡通過FatFS文件系統(tǒng)被模擬成一個U盤,使PC可以象操作普通U盤一樣操作這個TF卡,STM32和PC的數(shù)據(jù)交換通過TF卡進(jìn)行。TF卡初始化后在其中建立一個標(biāo)記是否升級App的標(biāo)志文件。
圖3 STM32加密升級固件的系統(tǒng)架構(gòu)
STM32升級固件時,把自己的 CPUID加密后傳給PC上的控制程序,由PC通過網(wǎng)絡(luò)發(fā)給服務(wù)器。服務(wù)器事先保存了所有合法的CPUID,當(dāng)收到PC送來的CPUID時,首先檢查其合法性,如合法則用接收的CPUID作為密鑰對原始 bin文件進(jìn)行AES加密,所以對不同的STM32能生成不同的升級用bin文件。如果其他STM32試圖用自己的CPUID作密鑰解密這個 bin文件,則解密出的程序是錯誤的,不能執(zhí)行。
STM32系統(tǒng)的 Bootlaoder可以在硬件能正常工作后用仿真器統(tǒng)一燒寫,第一個App可以直接應(yīng)用本文提出的方法升級寫入。
3.2 Bootloader的設(shè)計
Bootloader在完成自身的初始化后,檢查TF卡上的寫入標(biāo)志文件的變化,如果同時具有寫入標(biāo)志和新的bin文件,則把bin文件讀入內(nèi)存,以自己的CPUID作密鑰,應(yīng)用AES算法解密bin文件,接著使用IAP把新的 App寫入 Flash。新的App寫入完成或者無需升級時,直接跳轉(zhuǎn)到App執(zhí)行。Bootloader的工作流程可用圖4表示。
圖4 Bootloader工作流程
3.3 App的設(shè)計
App程序執(zhí)行時,除完成正常工作外,每隔一定時間檢查一次TF卡上的寫入標(biāo)志文件,如果發(fā)現(xiàn)PC上的控制程序改寫了升級標(biāo)志,則讀出CPUID,用一個固定密鑰經(jīng)AES加密后寫到TF卡上,通過這種方式把加密后的CPUID由PC傳給了服務(wù)器。PC控制程序獲得服務(wù)器返回的加密bin文件后,寫到TF卡上。STM32重啟后在Bootloader中完成App的固件升級。
4.1 STM32的IAP
STM32有三種啟動方式,具體采用哪種由 STM32的BOOT0和 BOOT1兩個引腳的組合決定[11],只要 BOOT0置低,無論BOOT1置高或置低,STM32都從內(nèi)部 Flash啟動。STM32內(nèi)部的Flash地址從 0x8000000開始,Cortex-M3內(nèi)核的 Flash起始地址的第一個字(4 B)必須是棧頂指針的值,第二個字存放復(fù)位中斷向量的地址,隨后才是STM32要執(zhí)行的代碼。為了實現(xiàn)應(yīng)用程序的IAP功能,STM32片內(nèi)的Flash要分成兩個區(qū)域,開始的一部分存儲Bootloader,后面的一部分存儲 App。STM32啟動時首先從 0x8000000地址開始執(zhí)行,即先執(zhí)行 Bootloader,在Bootloader中再跳轉(zhuǎn)到App。
Bootloader中的 IAP流程是:首先解鎖 Flash,擦除App占用的Flash塊區(qū);然后從TF卡中讀出升級bin文件,應(yīng)用AES算法解密;解密后的代碼按順序?qū)懭肷弦徊讲脸?Flash,全部 App寫入完成再對 Flash加鎖以防止被調(diào)試工具讀出。
Bootloader通過IAP完成固件的寫入后,執(zhí)行以下代碼完成到 App的跳轉(zhuǎn)[12]:
4.2 App代碼的修改和開發(fā)環(huán)境的設(shè)置
因為App程序沒有存儲在Flash的起始地址,所以在App的main函數(shù)中要重新設(shè)置中斷向量表的起始地址,否則會因為中斷向量地址出錯導(dǎo)致App不能正常運(yùn)行。這可以通過調(diào)用STM32固件庫中的函數(shù)NVIC_Set-VectorTable來實現(xiàn),該函數(shù)的第一個參數(shù)是 Flash的起始地址,第二個參數(shù)是App在Flash中的偏移量。
通過IAP升級App使用的文件必須是 bin格式,但編譯器直接編譯生成的是hex文件,因此還需要使用開發(fā)工具鏈中的工具把 hex文件轉(zhuǎn)換成bin文件,PC控制程序拷貝到TF卡中的就是服務(wù)器加密后的bin文件。
STM32芯片內(nèi)置的全球唯一96位 ID可以作為芯片的身份認(rèn)證標(biāo)志,同時具有大容量的 Flash,可以同時存儲Bootloader和App,并支持 IAP。STM32的這兩個特點為使用AES算法加密生成不同的升級文件提供了物質(zhì)基礎(chǔ)。經(jīng)過實際測試,把服務(wù)器為某一個STM32生成的加密 bin文件拷貝到其他 STM32系統(tǒng)后并正確改寫升級標(biāo)志,STM32系統(tǒng)重啟后應(yīng)用程序無法執(zhí)行。應(yīng)用二進(jìn)制分析軟件對不同 STM32請求升級得到的 bin文件進(jìn)行對比,發(fā)現(xiàn)所有 bin文件均不相同,因此本文提出的方法可以為不同的STM32生成唯一的升級文件,有效防止了非法用戶的盜版行為。
[1]ST Microelectronic Corporation.STM32F10x refrence manual[Z]. 2008.
[2]黃智偉,王兵,朱衛(wèi)華.STM32F 32位ARM微控制器應(yīng)用設(shè)計與實踐[M].北京:北京航空航天大學(xué)出版社,2014.
[3]藤廣超,郎建軍,杜其才,等.基于 STM32的硬件狗設(shè)計與實現(xiàn)[J].微處理機(jī),2013(6):70-72.
[4]張煒軒,王菲,王玉平.基于專用加密芯片的單片機(jī)加密系統(tǒng)設(shè)計[J].單片機(jī)與嵌入式系統(tǒng),2013(9):56-59.
[5]易威,彭億強(qiáng),羅森僑.基于 1-Wire安全器件的單片機(jī)加密認(rèn)證系統(tǒng)[J].電子科技,2013,26(7):180-182.
[6]潘永雄,胡敏強(qiáng),羅小偉.單片機(jī)控制程序加密策略探索與應(yīng)用[J].計算機(jī)工程與設(shè)計,2010,31(11):2466-2469.
[7]ST Microelectronic Corporation.STM32F10xxx Cortex-M3 programming manual[Z].2008.
[8]NIST.Advanced encryption standard(AES)[S].Federal Information Processing Standards Publication,2001.
[9]何明星,林昊.AES算法原理及其實現(xiàn)[J].計算機(jī)應(yīng)用研究,2002(12):61-63.
[10]ST Microelectronic Corporation.STM32F10x in-application programming[Z].2008.
[11]ST Microelectronics Corporation.STM32F10x Flash programming[Z].2008.
[12]ST Microelectronics Corporation.UM0424 user manual-STM32F10xxx USB development kit[Z].2008
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)
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.
STM32;CPUID;AES algorithm;encryption;decryption;In Application Programing(IAP)
TP311
:A
:0258-7998(2015)03-0028-03
10.16157/j.issn.0258-7998.2015.03.005
2014-11-24)
曹欲曉(1971-),男,碩士,講師,主要研究方向:嵌入式系統(tǒng)、無線傳感器網(wǎng)絡(luò)。
韓冬(1975-),通信作者,男,博士,主要研究方向:控制理論與控制工程,E-mail:handong2013@mail.tsinghua.edu. cn。
徐金寶(1970-),男,碩士,副教授,主要研究方向:嵌入式系統(tǒng)、軟件工程。