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