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