文獻標識碼: 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],,具有高性能,、低功耗、低成本的優(yōu)勢,,被廣泛應用在工業(yè)控制,、醫(yī)療和手持設備等眾多領域中。與PC上的軟件一樣,,嵌入式系統(tǒng)的固件(即軟件)也需要不斷升級?,F(xiàn)在固件的升級一般是使用JTAG或SWD仿真器,通過專用軟件完成,,所有產品的升級使用相同的文件,,因此易被非法用戶盜版使用,。
為了防止固件被盜版,文獻[3]提出了一種使用硬件狗對單片機程序進行加密的方法,,程序在運行過程中不斷對硬件狗進行訪問和讀寫,,通過硬件狗的唯一性來保證加密后的固件不被非法訪問和復制。文獻[4]利用一種專用加密芯片AT88SA102S把單片機中的固件程序和加密芯片進行綁定,,從而實現(xiàn)了對單片機程序的保護,。文獻[5]使用一種1-Wire安全器件,采用安全散列算法SHA-1對固件程序進行認證,,防止對固件的非法拷貝,。文獻[6]提出了應用芯片唯一身份識別碼、RC振蕩器頻率和上電標志進行軟件加密的方法,。
上述方法雖然能有效地保護單片機的應用程序,,但是采用硬件器件加密的方法需要額外的硬件單元,提高了電路的復雜性和產品的成本,;采用軟件加密的方法,,則需要對每一個芯片單獨編譯燒寫加密后的應用程序,增加了產品批量生產時的工作量,。
針對上述固件升級以及硬件和軟件加密方案的不足,,本文在分析了STM32系列微控制器結構特點的基礎上,把STM32內部的全球唯一CPUID作為密鑰,,應用AES算法對STM32應用程序所在的bin文件進行加密,,給不同的STM32芯片生成不同的升級bin文件。加密后的bin文件由STM32以自己的CPUID作為密鑰解密,,并通過IAP技術寫入Flash,,從而實現(xiàn)應用程序的合法升級完全由唯一的CPUID控制,只有合法的STM32芯片才能正確地升級固件,,防止了非法用戶對應用程序的拷貝復制,。
1 CPUID和AES算法
1.1 STM32的CPUID
每一個STM32微控制器內部都有一個96位的全球唯一序列號,存儲在地址0x1fff7a10-0x1fff7a18處,,稱為CPUID,。這個CPUID是STM32芯片的身份標識[7],只能讀出不能寫入,,任何兩片STM32微控制器的CPUID都是不相同的,,并且同一批次的STM32芯片的CPUID也毫無規(guī)律性,所以CPUID可以用來判斷芯片的合法性以決定是否執(zhí)行固件程序,。
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算法應容易在各種硬件平臺和軟件平臺上實現(xiàn),。經過幾輪篩選,最終由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執(zhí)行程序時,,通過正在執(zhí)行的程序完成對片內Flash的改寫,。利用IAP,可以在程序正常執(zhí)行時向Flash寫入新的數據或程序,,克服了以往改寫Flash需要停止程序運行的缺點,。
通過IAP更新固件,新的固件可以來自串行口,、USB,、以太網等數據接口,也可以來自外接的TF卡,。STM32在執(zhí)行IAP操作時,,首先對片內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的數據交換通過TF卡進行。TF卡初始化后在其中建立一個標記是否升級App的標志文件,。
STM32升級固件時,,把自己的CPUID加密后傳給PC上的控制程序,由PC通過網絡發(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文件讀入內存,以自己的CPUID作密鑰,,應用AES算法解密bin文件,,接著使用IAP把新的App寫入Flash。新的App寫入完成或者無需升級時,直接跳轉到App執(zhí)行,。Bootloader的工作流程可用圖4表示,。
3.3 App的設計
App程序執(zhí)行時,除完成正常工作外,,每隔一定時間檢查一次TF卡上的寫入標志文件,,如果發(fā)現(xiàn)PC上的控制程序改寫了升級標志,則讀出CPUID,,用一個固定密鑰經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都從內部Flash啟動。STM32內部的Flash地址從0x8000000開始,,Cortex-M3內核的Flash起始地址的第一個字(4 B)必須是棧頂指針的值,,第二個字存放復位中斷向量的地址,隨后才是STM32要執(zhí)行的代碼,。為了實現(xiàn)應用程序的IAP功能,,STM32片內的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,;
//給函數指針賦值
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
//初始化用戶堆棧指針
Jump_To_Application();//跳轉到App執(zhí)行
4.2 App代碼的修改和開發(fā)環(huán)境的設置
因為App程序沒有存儲在Flash的起始地址,,所以在App的main函數中要重新設置中斷向量表的起始地址,,否則會因為中斷向量地址出錯導致App不能正常運行。這可以通過調用STM32固件庫中的函數NVIC_Set-
VectorTable來實現(xiàn),,該函數的第一個參數是Flash的起始地址,,第二個參數是App在Flash中的偏移量。
通過IAP升級App使用的文件必須是bin格式,,但編譯器直接編譯生成的是hex文件,,因此還需要使用開發(fā)工具鏈中的工具把hex文件轉換成bin文件,PC控制程序拷貝到TF卡中的就是服務器加密后的bin文件,。
5 結語
STM32芯片內置的全球唯一96位ID可以作為芯片的身份認證標志,,同時具有大容量的Flash,可以同時存儲Bootloader和App,,并支持IAP,。STM32的這兩個特點為使用AES算法加密生成不同的升級文件提供了物質基礎。經過實際測試,,把服務器為某一個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.