張 鉚 洪 澤 蔣炯煒
(中國電子科技集團公司第五十八研究所 江蘇無錫 214072)
隨著互聯(lián)網(wǎng)、物聯(lián)網(wǎng)等技術(shù)的飛速發(fā)展,嵌入式應(yīng)用已日漸普及,無論是從高清電視到機器人,還是從汽車到飛機,都離不開Flash的使用[1].Flash由于其存儲容量大、密度高等特性,已經(jīng)在嵌入式系統(tǒng)中得到廣泛的應(yīng)用.
目前,F(xiàn)lash存儲器主要用于存放用戶自行開發(fā)的應(yīng)用程序.但由于近幾年封裝技術(shù)的突破,給用戶對Flash存儲器的燒寫帶來極大不便,特別是Flash芯片已經(jīng)焊接在電路上[2].針對上述問題,本文采用FTDI的USB2.0通信芯片F(xiàn)T2232H和SOC設(shè)計了一種高效的存儲器燒寫系統(tǒng).為了進(jìn)一步提升燒寫系統(tǒng)的安全性,該系統(tǒng)利用SHA-1算法完成了上位機與下位機的身份認(rèn)證.
系統(tǒng)結(jié)構(gòu)如圖1所示,包含上位機、JTAG仿真器、下位機.其中上位機部分包含應(yīng)用層APP以及FT2232H提供的動態(tài)鏈接庫FTCJTAG.dll和驅(qū)動程序ftd2xx.dll;JTAG仿真器包含JTAG Porbe的物理接口,內(nèi)部主要集成了FT2232H芯片,信號經(jīng)過電平轉(zhuǎn)換芯片后與下位機TAP通信;下位機部分包含測試端口控制器TAP、片上調(diào)試器OCD以及SOC核.上位機軟件通過控制JTAG仿真器,給下位機TAP發(fā)指令,TAP收到指令后繼續(xù)給OCD發(fā)指令,上位機軟件和下位機軟件就是通過OCD實現(xiàn)數(shù)據(jù)的交互.
圖1 系統(tǒng)結(jié)構(gòu)圖
邊界掃描測試核心控制器是TAP控制器.通過TMS和TCK,選取使用數(shù)據(jù)寄存器掃描、指令寄存器掃描及邊界測試各個狀態(tài)的控制器[3].在TCK的上升沿采樣TDI和TMS,在TCK的下降沿采樣TDO[4].TAP控制器的狀態(tài)機如圖2所示.TAP控制器分為4個部分,分別為復(fù)位、自檢、指令寄存器掃描和數(shù)據(jù)寄存器掃描,一共有16個狀態(tài)[5].
圖2 TAP控制器狀態(tài)機
表1所示為TAP指令,TAP模塊內(nèi)部集成了這些寄存器,JTAG通過訪問這些寄存器就可以控制TAP模塊.
表1 TAP指令表
圖3所示為JTAG接口時序圖,TDI數(shù)據(jù)流格式從低向高發(fā)送,其狀態(tài)機描述如下:
1)圖3處在Run-Test-Idle模式.
圖3 JTAG接口時序圖
2)TMS經(jīng)過1100后,進(jìn)入Shift-IR模式,即TAP命令模式;TDI發(fā)送0x1C,即NARSEL命令.
3)TMS經(jīng)過1,進(jìn)入Exit1-IR模式.
4)TMS經(jīng)過10,進(jìn)入Run-Test-Idle模式.
5)TMS經(jīng)過100,進(jìn)入Shift-DR模式,即TAP數(shù)據(jù)模式;TDI發(fā)送0x8F,即NAR=0x8F.
6)TMS經(jīng)過1,進(jìn)入Exit1-DR模式.
7)TMS經(jīng)過10,進(jìn)入Run-Test-Idle模式.
8)TMS經(jīng)過100,進(jìn)入Shift-DR模式;TDI發(fā)送0x000072F0,即NDR=0x000072F0.
9)TMS經(jīng)過1,進(jìn)入Exit1-DR模式.
OCD(on chip debugger)即片上調(diào)試器.在調(diào)試過程中,將實時跟蹤功能和運行控制功能分開實現(xiàn),用戶通過專用的串行信號接口訪問CPU核內(nèi)的調(diào)試控制邏輯模塊,獲取片內(nèi)各種資源,并實現(xiàn)CPU運行的停止和繼續(xù)[6-7].
OCD模塊初始化每條命令占用6個字節(jié),第1個字節(jié)表示命令和數(shù)據(jù)標(biāo)識,其中2表示命令,1表示數(shù)據(jù);第2個字節(jié)表示位寬;第3~6個字節(jié)表示命令信息或者數(shù)據(jù)信息,低字節(jié)在前.如TAP指令“Bypass”:0x02,0x05,0x1F,0x00,0x00,0x00;TAP指令“讀取設(shè)備ID”:0x02,0x05,0x1F,0x00,0x00,0x00;TAP指令讀“取32字節(jié)設(shè)備ID號”:0x01,0x32,0x00,0x00,0x00,0x00;TAP指令“讀電源和復(fù)位狀態(tài)”:0x02,0x05,0x09,0x00,0x00,0x00;TAP指令“讀取8位電源和復(fù)位狀態(tài)”:0x01,0x08,0x00,0x00,0x00,0x00.OCD指令“置Debug控制寄存器”:0x01,0x08,0x87,0x00,0x00,0x00;OCD指令“使能OCD”:0x01,0x32,0x01,0x00,0x00,0x00;TAP指令“進(jìn)入NARSEL模式”:0x02,0x05,0x1C,0x00,0x00,0x00.
當(dāng)進(jìn)入NARSEL狀態(tài)后,無需再配置NAREL指令,直接NAR,NDR,NAR,NDR循環(huán).其中NAR代表7位地址寄存器和1位讀寫狀態(tài),NDR代表32位數(shù)據(jù)寄存器.
SHA-1算法能夠?qū)?12位的輸入數(shù)據(jù)壓縮成160位的MAC輸出.SHA-1算法運算過程大體可分為2個部分:
1)消息填充.
SHA-1算法將512位數(shù)據(jù)分為1組,對不滿512位的數(shù)據(jù)進(jìn)行填充,使填充后的數(shù)據(jù)長度為512的整數(shù)倍[8].數(shù)據(jù)填充的規(guī)則是在消息末尾填充“100…0”,使其長度為448,再填充上64位的消息長度.填充后的消息正好是512的倍數(shù),按512位劃分為n塊數(shù)據(jù),每一塊數(shù)據(jù)按32位可以分為16組M0,M1,…,M15.
2)消息摘要計算.
SHA-1算法先將消息塊的16組數(shù)據(jù)M0,M1,…,M15擴展得到80組數(shù)據(jù)W0,W1,…,W79,擴充方法如下[9]:
Wt=Mt, 0≤t≤15,
Wt=(Wt-3⊕Wt-8⊕Wt-14⊕Wt-16)<<<1,
16≤t≤79.
SHA-1設(shè)置了5個32位寄存器,分別標(biāo)記為A,B,C,D,E,用于存儲MAC計算值.這5個寄存器的初始值如下所示:
A=0x67452301;
B=0xEFCDAB89;
C=0x98BADCFE;
D=0x10325476;
E=0xC3D2E1F0.
SHA-1需要經(jīng)過4輪運算,共80個步驟才能得到MAC值.0≤t≤79,A,B,C,D,E循環(huán)迭代操作步驟如下:
At=(At-1)<<<5+ft(Bt-1,Ct-1,Dt-1)+
Et-1+Wt+Kt;
Bt=At-1;
Ct=(Bt-1)<<<30;
Dt=Ct-1;
Et=Dt-1.
其中Kt和ft(x,y,z)分別是定義好的常數(shù)和邏輯函數(shù),經(jīng)過80輪循環(huán)迭代以后,由A,B,C,D,E構(gòu)成160位MAC值.
本文的燒寫安全系統(tǒng)在保持燒寫設(shè)備原有硬件結(jié)構(gòu)不變的情況下,通過加入SHA-1加密算法模塊提高嵌入式設(shè)備的安全性[10].
如圖4所示,上位機和下位機有相同的ID號,大小64位,上位機隨機生成448位大小的隨機值,并把隨機值發(fā)給下位機;上位機和下位機分別使用SHA-1加密算法生成160位的MAC值1、MAC值2,下位機把MAC值2發(fā)送給上位機,上位機對比2個MAC值是否相等,如果相等則執(zhí)行燒寫程序,不相等則進(jìn)行報錯.下位機設(shè)置超時等待時間,如果上位機在規(guī)定時間內(nèi)發(fā)出燒寫程序,則下位機執(zhí)行燒寫,否則不執(zhí)行.
圖4 加密認(rèn)證構(gòu)架圖
應(yīng)用層使用C#編寫基于FTCJTAG.dll的函數(shù)接口.圖5所示為上位機主程序流程圖,主要包含對FT2232H的初始化、TAP的初始化和OCD的初始化,初始化完畢后才能控制OCD模塊操作SOC核進(jìn)行身份驗證及燒寫程序.
圖5 上位機主程序流程圖
以擦除過程為例,需要先設(shè)置擦除的包數(shù)據(jù),把包下載到下位機指定包處理區(qū)域,清除下位機給上位機的應(yīng)答信號;然后運行下位機程序,下位機讀到包的信息后,根據(jù)指令操作擦除命令,等擦完后給上位機發(fā)送應(yīng)答信號;上位機接收到應(yīng)答信號后停止下位機的運行,結(jié)束擦除線程.
下位機軟件主要負(fù)責(zé)驅(qū)動程序的設(shè)計,包括下位機的正常初始化以及各種存儲器的燒寫驅(qū)動,下位機的初始化需要啟動更快的CPU時鐘,這樣可以提高JTAG的訪問速度和燒寫Flash的速度.各種存儲器的燒寫驅(qū)動根據(jù)SOC生成本身的驅(qū)動代碼定制而成.
圖6所示為下位機主程序流程圖,主要處理SOC核的初始化、身份真實性識別和包命令判斷.其中Flash的子程序又可以根據(jù)上位機的需要添加如ID讀取、整片擦除、扇區(qū)擦除、空檢測、讀、編程等命令.
圖6 下位機主程序流程圖
本文針對市面上比較常見的片上Flash,SPI Flash和NORFlash進(jìn)行了實驗[11].上位機和下位機在進(jìn)行身份認(rèn)證后,對JTAG加載時間、存儲器擦除時間、存儲器加載時間、燒寫等待時間進(jìn)行計算.本實驗把SOC運行時鐘設(shè)置為300 MHz,JTAG速率設(shè)置為30 MHz,通過上位機燒寫1 MB數(shù)據(jù)到Flash上,具體時間如表2所示:
表2 不同存儲器實驗結(jié)果對照
本文介紹了一種基于SHA-1身份認(rèn)證的Flash程序燒寫系統(tǒng).系統(tǒng)采用SHA-1算法進(jìn)行身份認(rèn)證,有效地提高了燒寫的安全性;采用FTDI的USB2.0通信芯片F(xiàn)T2232H,快速地完成對SOC的Flash程序燒寫.該系統(tǒng)方法在實驗中得到有效的認(rèn)證,且實驗結(jié)果和理論較為接近,下載速度也已經(jīng)達(dá)到極限,同時也適用于其他嵌入式芯片.