基于閃存的微控制器在代碼發(fā)布中的代碼保護(hù)
裝載程序使用數(shù)據(jù)包,數(shù)據(jù)包有數(shù)據(jù)頭和校驗(yàn)和以驗(yàn)證傳輸。如果數(shù)據(jù)包傳輸?shù)搅丝刂破鞑⑶倚r?yàn)和是正確的,則裝載程序把它交給解碼引擎(如果它是加密的)。在加密數(shù)據(jù)的內(nèi)部有另外一個(gè)密碼校驗(yàn)和,這給解密引擎一個(gè)驗(yàn)證密碼信息的手段。它將首先應(yīng)用通用碼并測(cè)試校驗(yàn)和,如果失敗,則利用來(lái)自串行數(shù)字的唯一密碼重試。如果再次失敗,則告訴裝載程序固件對(duì)這個(gè)設(shè)備無(wú)效。這也可防止代碼被未經(jīng)授權(quán)的篡改和意外損壞。
如果解密引擎成功地解碼數(shù)據(jù), 它將把數(shù)據(jù)交給在閃存中對(duì)實(shí)際閃存塊進(jìn)行編程的程序例程。當(dāng)然,對(duì)于不同產(chǎn)家,這個(gè)程序是不同的,在后面的設(shè)計(jì)實(shí)例中將給出COP8的程序。這個(gè)程序保留了一個(gè)128字節(jié)的RAM用于更新閃存。當(dāng)然,這塊RAM在裝載程序完成后可以存放應(yīng)用程序的數(shù)據(jù)。
設(shè)計(jì)實(shí)例
圖3是一個(gè)具備解密功能的固件裝載程序的流程圖。裝載程序使用在編程器和系統(tǒng)模擬程序中廣泛使用的修改版Intel HEX數(shù)據(jù)格式。這將使應(yīng)用程序現(xiàn)有架構(gòu)支持標(biāo)準(zhǔn)并易于使用。裝載固件程序用COP8匯編語(yǔ)言編寫,以簡(jiǎn)少代碼,并利用器件全部的閃存特性。
簡(jiǎn)單來(lái)說(shuō),Intel HEX格式是一種用ASCII編碼表示的數(shù)據(jù)記錄格式,用于向設(shè)備的存儲(chǔ)器編程對(duì)象代碼或數(shù)據(jù)。該格式由下列字段組成:使用ASCII字符0x3A或者即 “:”記錄起始字段、長(zhǎng)度范圍為0x00-0xFF的數(shù)據(jù)長(zhǎng)度字段(兩個(gè)ASCII字符)、偏移字段、記錄類型字段、信息或數(shù)據(jù)字段以及校驗(yàn)和字段。每個(gè)字段都由標(biāo)準(zhǔn)的可打印ASCII字符表示。例如,“10”代表十六進(jìn)制0x10或者十進(jìn)制16,可表示長(zhǎng)度字段。實(shí)際上它的編碼是0x31、0x30,這是“0” 和“1” 的ASCII碼。因?yàn)閮?nèi)容是可打印的ASCII字符,能被文本編輯器查看,所以需要加密。
表里包括了標(biāo)準(zhǔn)的Intel HEX格式記錄類型。注意該標(biāo)準(zhǔn)只定義了6種記錄類型。為利用現(xiàn)有的結(jié)構(gòu),裝載程序采用Intel HEX 格式,并指定加密數(shù)據(jù)為一種新的記錄類型。記錄類型0x10將被用于代表加密數(shù)據(jù),這是不能變的。
代碼裝載程序也需要一個(gè)流程控制方法,以保證在下一個(gè)記錄裝載之前,寫閃存的周期已經(jīng)完成。在大多數(shù)的情況下,應(yīng)用程序會(huì)產(chǎn)生可分成16個(gè)字節(jié)一組的文件,以方使閱讀。通常閃存是以128或256字節(jié)進(jìn)行分塊,因此必須有一個(gè)裝載程序的命令要求從主機(jī)來(lái)的數(shù)據(jù)允許可變記錄大小。裝載程序必須能處理 256字節(jié)的數(shù)據(jù),因?yàn)榘凑諛?biāo)準(zhǔn),這是最大的記錄大小。表的底部顯示了本例中新擴(kuò)展的記錄類型。因?yàn)镃OP8系列器件只有16位地址,無(wú)法執(zhí)行記錄類型 0x02到 0x05。對(duì)于具備更大閃存的處理器,例如CR16,它能直接訪問(wèn)16M字節(jié)的內(nèi)存,就需要有擴(kuò)展線性地址的記錄類型。
觀察圖3中的流程圖,重新設(shè)置后的第一個(gè)任務(wù)是檢驗(yàn)閃存的內(nèi)容。這是通過(guò)讀取各個(gè)128字節(jié)的頁(yè)面(除了位于閃存頂部的自舉驗(yàn)證代碼和裝載程序代碼)來(lái)完成的。只驗(yàn)證應(yīng)用程序的代碼這使計(jì)算校驗(yàn)和非常容易。但如果需要,它也可以包括檢測(cè)裝載程序部件。當(dāng)通過(guò)校驗(yàn)和檢查,控制就被向量轉(zhuǎn)移到應(yīng)用程序固件的入口。入口保持不變非常重要。如果它發(fā)生了移動(dòng),裝載程序會(huì)把向量轉(zhuǎn)到一個(gè)不正確的入口,并可能出現(xiàn)崩潰。另外,裝載程序可以從代碼中讀出進(jìn)入向量,把向量壓入堆棧并返回,以迫使從那個(gè)地址開(kāi)始執(zhí)行。這個(gè)方案允許入口點(diǎn)可變。
如果校檢和失敗,裝載程序?qū)⒈3挚刂撇⒉粩嗟赝鳈C(jī)發(fā)送信號(hào),用硬件設(shè)計(jì)實(shí)現(xiàn)的任何手段開(kāi)始裝載。裝載程序也可以控制用戶接口通知這種狀態(tài)。在調(diào)試系統(tǒng)時(shí),一個(gè)表示“固件裝載” 的簡(jiǎn)單的LED燈非常有用。
裝載程序?qū)⒊掷m(xù)地向主機(jī)請(qǐng)求記錄,直到主機(jī)通過(guò)EOF記錄表明沒(méi)有記錄了。檢測(cè)到的0x10類型記錄將被送到解碼引擎,并適當(dāng)解碼數(shù)據(jù)。這使得實(shí)際向閃存寫數(shù)據(jù)的代碼,既可以操作加密數(shù)據(jù),也可操作對(duì)未加密數(shù)據(jù)。對(duì)開(kāi)發(fā)和內(nèi)部測(cè)試來(lái)說(shuō),未加密的數(shù)據(jù)通路很有價(jià)值。當(dāng)收到EOF記錄后,所有新固件數(shù)據(jù)都被寫入閃存。然后,裝載程序把控制交還給自舉測(cè)試,以驗(yàn)證新代碼未被破壞。
如上所述,現(xiàn)場(chǎng)可更新設(shè)備可以在不曝露IP的情況下得到實(shí)現(xiàn)。使用一個(gè)簡(jiǎn)單的密碼, 制造商的固件就能得到保護(hù),客戶可以在世界各地能夠訪問(wèn)因特網(wǎng)的地方更新他們的設(shè)備。
評(píng)論