文獻標識碼: A
文章編號: 0258-7998(2015)03-0028-03
中文引用格式:曹欲曉,韓冬,徐金寶.一種基于CPUID和AES算法的STM32固件升級方案[J].電子技術(shù)應(yīng)用,2015,41(03):28-30+34
0 引言
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)的固件(即軟件)也需要不斷升級。現(xiàn)在固件的升級一般是使用JTAG或SWD仿真器,,通過專用軟件完成,,所有產(chǎn)品的升級使用相同的文件,因此易被非法用戶盜版使用。
為了防止固件被盜版,,文獻[3]提出了一種使用硬件狗對單片機程序進行加密的方法,,程序在運行過程中不斷對硬件狗進行訪問和讀寫,通過硬件狗的唯一性來保證加密后的固件不被非法訪問和復(fù)制,。文獻[4]利用一種專用加密芯片AT88SA102S把單片機中的固件程序和加密芯片進行綁定,,從而實現(xiàn)了對單片機程序的保護。文獻[5]使用一種1-Wire安全器件,,采用安全散列算法SHA-1對固件程序進行認證,,防止對固件的非法拷貝。文獻[6]提出了應(yīng)用芯片唯一身份識別碼,、RC振蕩器頻率和上電標志進行軟件加密的方法,。
上述方法雖然能有效地保護單片機的應(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文件進行加密,給不同的STM32芯片生成不同的升級bin文件,。加密后的bin文件由STM32以自己的CPUID作為密鑰解密,,并通過IAP技術(shù)寫入Flash,從而實現(xiàn)應(yīng)用程序的合法升級完全由唯一的CPUID控制,,只有合法的STM32芯片才能正確地升級固件,,防止了非法用戶對應(yīng)用程序的拷貝復(fù)制。
1 CPUID和AES算法
1.1 STM32的CPUID
每一個STM32微控制器內(nèi)部都有一個96位的全球唯一序列號,,存儲在地址0x1fff7a10-0x1fff7a18處,,稱為CPUID。這個CPUID是STM32芯片的身份標識[7],,只能讀出不能寫入,,任何兩片STM32微控制器的CPUID都是不相同的,并且同一批次的STM32芯片的CPUID也毫無規(guī)律性,,所以CPUID可以用來判斷芯片的合法性以決定是否執(zhí)行固件程序,。
1.2 AES算法
AES(Advanced Encryption Standard)是NIST(美國國家標準技術(shù)研究所)用來代替DES算法的新一代數(shù)據(jù)加密標準。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標準的最終算法[8],。
AES算法是一種對稱加密算法,,加密和解密使用相同的密鑰。AES算法的輸入是固定長度的分組,,輸出分組的長度和輸入分組相同,,每一個分組和密鑰的長度可以是128 bit、192 bit或256 bit,,對應(yīng)的加密輪數(shù)分別是10,、12或14輪。取分組長度和密鑰同為128 bit,,給出AES算法加密和解密的流程如圖1和圖2所示[9],。
2 IAP技術(shù)
IAP(In Application Programing)[10]的意思是“在應(yīng)用編程”,指CPU執(zhí)行程序時,,通過正在執(zhí)行的程序完成對片內(nèi)Flash的改寫,。利用IAP,可以在程序正常執(zhí)行時向Flash寫入新的數(shù)據(jù)或程序,,克服了以往改寫Flash需要停止程序運行的缺點,。
通過IAP更新固件,新的固件可以來自串行口,、USB,、以太網(wǎng)等數(shù)據(jù)接口,也可以來自外接的TF卡,。STM32在執(zhí)行IAP操作時,,首先對片內(nèi)Flash解鎖,接著擦除需要重新編程的Flash區(qū)域,,最后把新的固件代碼寫入,。使用IAP功能,需要有兩個可執(zhí)行程序,,一個稱為Bootloader,,另一個稱為App。Bootloader和App分別存儲在Flash的不同區(qū)域,,存儲空間不能重合,。Bootloader是啟動引導程序,負責應(yīng)用IAP改寫App固件并跳轉(zhuǎn)到App執(zhí)行,。App是正常工作時系統(tǒng)完成具體功能的應(yīng)用程序,。
3 基于CPUID和AES算法的STM32固件加密升級
3.1 系統(tǒng)架構(gòu)和總體原理
本文提出的加密升級方案,,一共需要三個組成部分:STM32系統(tǒng)、PC,、服務(wù)器,系統(tǒng)架構(gòu)如圖3所示,。STM32系統(tǒng)是需要升級的嵌入式系統(tǒng),。PC上運行一個升級控制程序,控制STM32的升級操作,,并在STM32系統(tǒng)和服務(wù)器之間進行通信,。服務(wù)器上存儲有IAP升級用的原始bin文件和所有合法的STM32微控制器的CPUID,負責為每一個STM32生成不同的bin文件,。STM32系統(tǒng)須具有一個USB從機接口,,用來與PC連接;還要有一個接在SDIO接口上的TF卡,,這個TF卡通過FatFS文件系統(tǒng)被模擬成一個U盤,,使PC可以象操作普通U盤一樣操作這個TF卡,STM32和PC的數(shù)據(jù)交換通過TF卡進行,。TF卡初始化后在其中建立一個標記是否升級App的標志文件,。
STM32升級固件時,把自己的CPUID加密后傳給PC上的控制程序,,由PC通過網(wǎng)絡(luò)發(fā)給服務(wù)器,。服務(wù)器事先保存了所有合法的CPUID,當收到PC送來的CPUID時,,首先檢查其合法性,,如合法則用接收的CPUID作為密鑰對原始bin文件進行AES加密,所以對不同的STM32能生成不同的升級用bin文件,。如果其他STM32試圖用自己的CPUID作密鑰解密這個bin文件,,則解密出的程序是錯誤的,不能執(zhí)行,。
STM32系統(tǒng)的Bootlaoder可以在硬件能正常工作后用仿真器統(tǒng)一燒寫,,第一個App可以直接應(yīng)用本文提出的方法升級寫入。
3.2 Bootloader的設(shè)計
Bootloader在完成自身的初始化后,,檢查TF卡上的寫入標志文件的變化,,如果同時具有寫入標志和新的bin文件,則把bin文件讀入內(nèi)存,,以自己的CPUID作密鑰,,應(yīng)用AES算法解密bin文件,接著使用IAP把新的App寫入Flash,。新的App寫入完成或者無需升級時,,直接跳轉(zhuǎn)到App執(zhí)行,。Bootloader的工作流程可用圖4表示。
3.3 App的設(shè)計
App程序執(zhí)行時,,除完成正常工作外,,每隔一定時間檢查一次TF卡上的寫入標志文件,如果發(fā)現(xiàn)PC上的控制程序改寫了升級標志,,則讀出CPUID,,用一個固定密鑰經(jīng)AES加密后寫到TF卡上,通過這種方式把加密后的CPUID由PC傳給了服務(wù)器,。PC控制程序獲得服務(wù)器返回的加密bin文件后,,寫到TF卡上。STM32重啟后在Bootloader中完成App的固件升級,。
4 STM32的IAP功能的實現(xiàn)
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ū)懭肷弦徊讲脸腇lash,,全部App寫入完成再對Flash加鎖以防止被調(diào)試工具讀出,。
Bootloader通過IAP完成固件的寫入后,執(zhí)行以下代碼完成到App的跳轉(zhuǎn)[12]:
JumpAddress=*(__IO uint32_t*) (APPLICATION_
ADDRESS + 4),;//取出App的中斷向量地址
Jump_To_Application=(pFunction) JumpAddress,;
//給函數(shù)指針賦值
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
//初始化用戶堆棧指針
Jump_To_Application();//跳轉(zhuǎn)到App執(zhí)行
4.2 App代碼的修改和開發(fā)環(huán)境的設(shè)置
因為App程序沒有存儲在Flash的起始地址,,所以在App的main函數(shù)中要重新設(shè)置中斷向量表的起始地址,,否則會因為中斷向量地址出錯導致App不能正常運行。這可以通過調(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文件,。
5 結(jié)語
STM32芯片內(nèi)置的全球唯一96位ID可以作為芯片的身份認證標志,同時具有大容量的Flash,,可以同時存儲Bootloader和App,,并支持IAP。STM32的這兩個特點為使用AES算法加密生成不同的升級文件提供了物質(zhì)基礎(chǔ),。經(jīng)過實際測試,,把服務(wù)器為某一個STM32生成的加密bin文件拷貝到其他STM32系統(tǒng)后并正確改寫升級標志,STM32系統(tǒng)重啟后應(yīng)用程序無法執(zhí)行,。應(yīng)用二進制分析軟件對不同STM32請求升級得到的bin文件進行對比,,發(fā)現(xiàn)所有bin文件均不相同,因此本文提出的方法可以為不同的STM32生成唯一的升級文件,,有效防止了非法用戶的盜版行為,。
參考文獻
[1] ST Microelectronic Corporation.STM32F10x refrence manual[Z].2008.
[2] 黃智偉,王兵,,朱衛(wèi)華.STM32F 32位ARM微控制器應(yīng)用設(shè)計與實踐[M].北京:北京航空航天大學出版社,,2014.
[3] 藤廣超,郎建軍,,杜其才,,等.基于STM32的硬件狗設(shè)計與實現(xiàn)[J].微處理機,2013(6):70-72.
[4] 張煒軒,,王菲,,王玉平.基于專用加密芯片的單片機加密系統(tǒng)設(shè)計[J].單片機與嵌入式系統(tǒng),2013(9):56-59.
[5] 易威,,彭億強,,羅森僑.基于1-Wire安全器件的單片機加密認證系統(tǒng)[J].電子科技,2013,,26(7):180-182.
[6] 潘永雄,,胡敏強,羅小偉.單片機控制程序加密策略探索與應(yīng)用[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 Infor-mation Processing Standards Publication,,2001.
[9] 何明星,林昊.AES算法原理及其實現(xiàn)[J].計算機應(yīng)用研究,,2002(12):61-63.
[10] ST Microelectronic Corporation.STM32F10x in-application programming[Z].2008.
[11] ST Microelectronics Corporation.STM32F10x Flash prog-ramming[Z].2008.