文獻標識碼: A
文章編號: 0258-7998(2015)03-0028-03
中文引用格式:曹欲曉,韓冬,徐金寶.一種基于CPUID和AES算法的STM32固件升級方案[J].電子技術應用,2015,41(03):28-30+34
0 引言
STM32是ST公司推出的基于ARM Cortex-M3[1]內(nèi)核的系列微控制器。STM32系列微控制器在Coretex-M3內(nèi)核的基礎上集成了豐富的外設單元[2],,具有高性能、低功耗,、低成本的優(yōu)勢,,被廣泛應用在工業(yè)控制、醫(yī)療和手持設備等眾多領域中,。與PC上的軟件一樣,,嵌入式系統(tǒng)的固件(即軟件)也需要不斷升級。現(xiàn)在固件的升級一般是使用JTAG或SWD仿真器,,通過專用軟件完成,,所有產(chǎn)品的升級使用相同的文件,因此易被非法用戶盜版使用,。
為了防止固件被盜版,,文獻[3]提出了一種使用硬件狗對單片機程序進行加密的方法,程序在運行過程中不斷對硬件狗進行訪問和讀寫,,通過硬件狗的唯一性來保證加密后的固件不被非法訪問和復制,。文獻[4]利用一種專用加密芯片AT88SA102S把單片機中的固件程序和加密芯片進行綁定,從而實現(xiàn)了對單片機程序的保護,。文獻[5]使用一種1-Wire安全器件,,采用安全散列算法SHA-1對固件程序進行認證,防止對固件的非法拷貝,。文獻[6]提出了應用芯片唯一身份識別碼,、RC振蕩器頻率和上電標志進行軟件加密的方法,。
上述方法雖然能有效地保護單片機的應用程序,,但是采用硬件器件加密的方法需要額外的硬件單元,,提高了電路的復雜性和產(chǎn)品的成本,;采用軟件加密的方法,則需要對每一個芯片單獨編譯燒寫加密后的應用程序,,增加了產(chǎn)品批量生產(chǎn)時的工作量,。
針對上述固件升級以及硬件和軟件加密方案的不足,,本文在分析了STM32系列微控制器結構特點的基礎上,把STM32內(nèi)部的全球唯一CPUID作為密鑰,,應用AES算法對STM32應用程序所在的bin文件進行加密,,給不同的STM32芯片生成不同的升級bin文件,。加密后的bin文件由STM32以自己的CPUID作為密鑰解密,,并通過IAP技術寫入Flash,從而實現(xiàn)應用程序的合法升級完全由唯一的CPUID控制,,只有合法的STM32芯片才能正確地升級固件,,防止了非法用戶對應用程序的拷貝復制。
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(美國國家標準技術研究所)用來代替DES算法的新一代數(shù)據(jù)加密標準,。NIST要求AES 候選算法需滿足以下基本要求:AES在體制上應是對稱分組密碼;密鑰的長度可以是128 bit,、 192 bit或 256 bit,;數(shù)據(jù)分組的長度可以是128 bit、192 bit或256 bit,;AES算法應容易在各種硬件平臺和軟件平臺上實現(xiàn),。經(jīng)過幾輪篩選,最終由Joan Daemen和Vincent Rijmen設計的Rijndael算法在2000年10月成為AES標準的最終算法[8],。
AES算法是一種對稱加密算法,,加密和解密使用相同的密鑰。AES算法的輸入是固定長度的分組,,輸出分組的長度和輸入分組相同,,每一個分組和密鑰的長度可以是128 bit,、192 bit或256 bit,,對應的加密輪數(shù)分別是10、12或14輪,。取分組長度和密鑰同為128 bit,,給出AES算法加密和解密的流程如圖1和圖2所示[9]。
2 IAP技術
IAP(In Application Programing)[10]的意思是“在應用編程”,,指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是啟動引導程序,負責應用IAP改寫App固件并跳轉到App執(zhí)行,。App是正常工作時系統(tǒng)完成具體功能的應用程序,。
3 基于CPUID和AES算法的STM32固件加密升級
3.1 系統(tǒng)架構和總體原理
本文提出的加密升級方案,一共需要三個組成部分:STM32系統(tǒng),、PC,、服務器,系統(tǒng)架構如圖3所示,。STM32系統(tǒng)是需要升級的嵌入式系統(tǒng),。PC上運行一個升級控制程序,控制STM32的升級操作,,并在STM32系統(tǒng)和服務器之間進行通信,。服務器上存儲有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)絡發(fā)給服務器,。服務器事先保存了所有合法的CPUID,當收到PC送來的CPUID時,,首先檢查其合法性,如合法則用接收的CPUID作為密鑰對原始bin文件進行AES加密,,所以對不同的STM32能生成不同的升級用bin文件,。如果其他STM32試圖用自己的CPUID作密鑰解密這個bin文件,則解密出的程序是錯誤的,,不能執(zhí)行,。
STM32系統(tǒng)的Bootlaoder可以在硬件能正常工作后用仿真器統(tǒng)一燒寫,第一個App可以直接應用本文提出的方法升級寫入,。
3.2 Bootloader的設計
Bootloader在完成自身的初始化后,,檢查TF卡上的寫入標志文件的變化,如果同時具有寫入標志和新的bin文件,,則把bin文件讀入內(nèi)存,,以自己的CPUID作密鑰,,應用AES算法解密bin文件,接著使用IAP把新的App寫入Flash,。新的App寫入完成或者無需升級時,,直接跳轉到App執(zhí)行。Bootloader的工作流程可用圖4表示,。
3.3 App的設計
App程序執(zhí)行時,,除完成正常工作外,每隔一定時間檢查一次TF卡上的寫入標志文件,,如果發(fā)現(xiàn)PC上的控制程序改寫了升級標志,,則讀出CPUID,用一個固定密鑰經(jīng)AES加密后寫到TF卡上,,通過這種方式把加密后的CPUID由PC傳給了服務器,。PC控制程序獲得服務器返回的加密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)必須是棧頂指針的值,第二個字存放復位中斷向量的地址,,隨后才是STM32要執(zhí)行的代碼,。為了實現(xiàn)應用程序的IAP功能,STM32片內(nèi)的Flash要分成兩個區(qū)域,,開始的一部分存儲Bootloader,,后面的一部分存儲App。STM32啟動時首先從0x8000000地址開始執(zhí)行,,即先執(zhí)行Bootloader,,在Bootloader中再跳轉到App。
Bootloader中的IAP流程是:首先解鎖Flash,,擦除App占用的Flash塊區(qū),;然后從TF卡中讀出升級bin文件,應用AES算法解密,;解密后的代碼按順序寫入上一步擦除的Flash,,全部App寫入完成再對Flash加鎖以防止被調試工具讀出。
Bootloader通過IAP完成固件的寫入后,,執(zhí)行以下代碼完成到App的跳轉[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(),;//跳轉到App執(zhí)行
4.2 App代碼的修改和開發(fā)環(huán)境的設置
因為App程序沒有存儲在Flash的起始地址,,所以在App的main函數(shù)中要重新設置中斷向量表的起始地址,否則會因為中斷向量地址出錯導致App不能正常運行,。這可以通過調用STM32固件庫中的函數(shù)NVIC_Set-
VectorTable來實現(xiàn),,該函數(shù)的第一個參數(shù)是Flash的起始地址,第二個參數(shù)是App在Flash中的偏移量,。
通過IAP升級App使用的文件必須是bin格式,,但編譯器直接編譯生成的是hex文件,因此還需要使用開發(fā)工具鏈中的工具把hex文件轉換成bin文件,,PC控制程序拷貝到TF卡中的就是服務器加密后的bin文件,。
5 結語
STM32芯片內(nèi)置的全球唯一96位ID可以作為芯片的身份認證標志,同時具有大容量的Flash,,可以同時存儲Bootloader和App,,并支持IAP。STM32的這兩個特點為使用AES算法加密生成不同的升級文件提供了物質基礎,。經(jīng)過實際測試,,把服務器為某一個STM32生成的加密bin文件拷貝到其他STM32系統(tǒng)后并正確改寫升級標志,STM32系統(tǒng)重啟后應用程序無法執(zhí)行,。應用二進制分析軟件對不同STM32請求升級得到的bin文件進行對比,,發(fā)現(xiàn)所有bin文件均不相同,因此本文提出的方法可以為不同的STM32生成唯一的升級文件,,有效防止了非法用戶的盜版行為,。
參考文獻
[1] ST Microelectronic Corporation.STM32F10x refrence manual[Z].2008.
[2] 黃智偉,王兵,,朱衛(wèi)華.STM32F 32位ARM微控制器應用設計與實踐[M].北京:北京航空航天大學出版社,,2014.
[3] 藤廣超,郎建軍,,杜其才,,等.基于STM32的硬件狗設計與實現(xiàn)[J].微處理機,2013(6):70-72.
[4] 張煒軒,,王菲,王玉平.基于專用加密芯片的單片機加密系統(tǒng)設計[J].單片機與嵌入式系統(tǒng),,2013(9):56-59.
[5] 易威,,彭億強,羅森僑.基于1-Wire安全器件的單片機加密認證系統(tǒng)[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算法原理及其實現(xiàn)[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.