《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 一種基于CPUID和AES算法的STM32固件升級方案
一種基于CPUID和AES算法的STM32固件升級方案
2015年電子技術應用第3期
曹欲曉1,,韓 冬2,徐金寶1
1.南京工程學院 計算機工程學院,,江蘇 南京211167,; 2.清華大學 自動化系,,北京100084
摘要: 針對STM32系統(tǒng)固件升級時使用同一個文件易被非法復制使用的缺陷,,提出并實現(xiàn)了一種一個STM32芯片使用一個唯一升級文件的固件升級方案。升級固件時,,由服務器為不同的STM32芯片生成不同的bin文件,,該bin文件是以STM32的CPUID為密鑰,應用AES算法加密原始bin文件得到的,。升級時STM32以自身的CPUID作為密鑰對文件解密,,如果作為解密密鑰的CPUID和作為加密密鑰的CPUID不同,則解密出的bin文件不能運行,。解密后,,再應用IAP技術把新的bin文件寫入Flash。實際測試證明,,提出的方法可以實現(xiàn)“一片一密”,,有效防止了升級程序的非法使用。
關鍵詞: STM32 CPUID AES算法 解密
中圖分類號: TP311
文獻標識碼: A
文章編號: 0258-7998(2015)03-0028-03
中文引用格式:曹欲曉,韓冬,徐金寶.一種基于CPUID和AES算法的STM32固件升級方案[J].電子技術應用,2015,41(03):28-30+34
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
Abstract: 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.
Key words : STM32,;CPUID,;AES algorithm;encryption,;decryption,;In Application Programing(IAP)

 

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)完成具體功能的應用程序,。

001.jpg

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的標志文件,。

003.jpg

  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表示,。

004.jpg

  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.


此內容為AET網站原創(chuàng),,未經授權禁止轉載,。