基于閃存的微控制器在代碼發(fā)布中的代碼保護(hù)
在如今競爭激烈的市場中,保護(hù)公司的知識(shí)產(chǎn)權(quán)(IP)是最高優(yōu)先級(jí)的事項(xiàng)之一。多年的開發(fā)可能產(chǎn)生了包含很多商業(yè)秘密或?qū)S兴惴ǖ脑O(shè)計(jì)。隨著基于閃存的微控制器得到更多地應(yīng)用并集成了更多的特性,許多公司摒棄傳統(tǒng)的一次性可編程(OTP)微控制器(MCU),轉(zhuǎn)而采用閃存。
閃存允許在生產(chǎn)線的終點(diǎn)進(jìn)行實(shí)時(shí)編程,也允許在生產(chǎn)之后修改代碼。但是如果通過因特網(wǎng),公司將面臨IP將泄漏給競爭者的問題。應(yīng)該采用各種方法來控制更新授權(quán)許可,并在泄漏產(chǎn)品的IP的情況下, 提供現(xiàn)場更新。
保護(hù)現(xiàn)場配置的軟件產(chǎn)品的方法很多,采用哪種方法取決于供應(yīng)商希望保護(hù)什么。大多數(shù)軟件保護(hù)機(jī)制是防止對(duì)程序或數(shù)據(jù)進(jìn)行未經(jīng)授權(quán)的復(fù)制。如今復(fù)制文件非常容易,通過因特網(wǎng)能很快地找到許多拷貝。當(dāng)固件是某個(gè)硬件平臺(tái)的一部分時(shí),保護(hù)固件中包含的IP通常比保護(hù)對(duì)文件的拷貝更重要。當(dāng)然,如果固件更新需要購買,那么保護(hù)拷貝也很重要。
另一個(gè)問題涉及基于微控制器產(chǎn)品破解密碼的性能。RSA和DES標(biāo)準(zhǔn)對(duì)性能和存儲(chǔ)器的要求都很高。不幸的是,大多數(shù)的微控制器在這兩方面的資源都有限,從而要求不同的加密和解密方法。我們必須提供一種通用的或者針對(duì)特定設(shè)備的密鑰方案。
簡單密碼
循環(huán)碼(Rolling-code)產(chǎn)生器已在車庫門鎖、安全進(jìn)出卡等多種設(shè)備上應(yīng)用多年。圖1顯示簡單的循環(huán)碼產(chǎn)生器是如何工作的。一組具有相同時(shí)鐘信號(hào)的雙穩(wěn)態(tài)觸發(fā)器串聯(lián)連接,其輸出端有各種抽頭。在給出的例子中,Q2端沒有被使用,其余的輸出端連接唯一的OR功能端口,該端口在每個(gè)時(shí)鐘信號(hào)沿得到新的輸入位。可能產(chǎn)生的組合數(shù)目取決于觸發(fā)器的個(gè)數(shù)和接到OR函數(shù)端口的抽頭個(gè)數(shù)。
通常將幾個(gè)觸發(fā)器的輸出用作循環(huán)鑰匙碼。實(shí)際應(yīng)用時(shí)(如作在車庫門鎖),使用一個(gè)完全相同的發(fā)生器來測試鑰匙碼。隨著新碼被不斷地使用,會(huì)發(fā)生整個(gè)序列重復(fù)出現(xiàn)的情況,這可能是在千萬或幾億個(gè)鑰匙碼之后。這時(shí)就不能再使用它了。在用于車庫門鎖的情況下,它可以防止罪犯用無線接收機(jī)盜聽并簡單地重現(xiàn)鑰匙碼以開門。
在代碼加密的情況下,觸發(fā)器的輸出與被加密或解密的數(shù)據(jù)被送到另外一個(gè)OR函數(shù)端口(圖2中的A1)。數(shù)據(jù)的每個(gè)字節(jié)、字或雙字都與選中的觸發(fā)器端口進(jìn)行OR運(yùn)算,再加上用戶特定另外函數(shù)。那個(gè)函數(shù)可以簡單到只加上一個(gè)常數(shù)。這個(gè)過程必須是可逆的,所以用戶定義的函數(shù)不是隨機(jī)的。由安置觸發(fā)器抽頭決定的密碼和由移位寄存器的初態(tài)、所選定的種子一起提供了加密和解密的算法??砂凑沾袛?shù)字的方法拆分這些密碼,以向特定設(shè)備提供唯一的密碼。也就是說,設(shè)備的串行號(hào)碼僅提供一半的密碼信息,制造商保留其余密碼信息。很明顯,這種方案存在著多種排列。
在固件更新是向全球發(fā)布時(shí),例如,適用所有產(chǎn)品的錯(cuò)誤的更新,可以使用一個(gè)特別的串行碼。解密引擎首先嘗試用全球碼,-----可能是一個(gè)特殊數(shù)字圖樣。如果全球碼沒有解密出正確的校驗(yàn)和,才使用唯一的密碼。它可以告訴裝載程序:加密的源文件包含了什么類型的固件更新數(shù)據(jù)。
傳輸方法
很明顯,產(chǎn)品內(nèi)必須要有某種解碼引擎和代碼裝載程序。這里討論的技術(shù)可以用COP8微控制器來解釋。該目標(biāo)控制器是包含32KB閃存和1KB RAM的COP8CBR。對(duì)于現(xiàn)場可更新的設(shè)備,必須注意這樣一個(gè)說明以防止誤解:微控制器必須具有一邊運(yùn)行程序一邊對(duì)閃存進(jìn)行編程的能力。不能用把控制器保持在重新設(shè)置狀態(tài)或者要求外部編程來更新存儲(chǔ)著程序的閃存。解碼和裝載程序必須駐留在控制器內(nèi)部,并且完全可靠。COP8閃存產(chǎn)品能滿足這些要求。
固件的裝載程序是一個(gè)代碼模塊,它在重新設(shè)置后運(yùn)行,并能判斷本次裝載是否有效。如果發(fā)現(xiàn)被裝載的代碼無效,裝載程序就進(jìn)入裝載模式(LOAD MODE),直到有能夠操作的固體程序。可通過控制器提供的物理層接口來實(shí)現(xiàn)這點(diǎn)。COP8可使用串口。如果當(dāng)前代碼是有效的,裝載程序會(huì)把控制交給固件應(yīng)用程序的入口。
COP8系列的另一個(gè)特性是可以采用軟件陷阱以引導(dǎo)恢復(fù)機(jī)制。它執(zhí)行操作碼0x00,可將這個(gè)操作碼編程到所有未用單元。如果這個(gè)操作碼被執(zhí)行,操作將從軟件陷阱向量開始,使裝載程序重新評(píng)估固件的完整性。這是一個(gè)容錯(cuò)的好特性。不管什么原因,代碼被破壞,裝載程序?qū)⒌玫娇刂?,以便讓技術(shù)人員(或用戶)重新裝載固件。
評(píng)論