W80X系列芯片的程序保護措施共有三種方式:防拷貝、固件加密、固件簽名。在防拷貝的基礎上使用固件簽名和固件加密可以進一步提高保護級別。防拷貝的原理是利用芯片的Flash Unique ID的唯一性來對比判斷,如果一致才能繼續運行程序。在生產燒錄固件階段,我們將待燒錄測試的設備稱作DUT,在固件燒錄時,燒錄工具會讀取DUT的Flash Unique ID,加密後寫入Flash的A地址,燒錄成功後,設備程序運行時,先讀取芯片的Flash Unique ID,接著讀取A地址存放的加密ID,進行解密,解密後對比兩個ID是否一致,如果一致,接著運行程序,如果不一致,則認為程序被拷貝運行,停止運行。
1、安裝openssl工具
需要1.0及以上版本,文件夾中自帶了win 64位1.1版本的安裝文件,也可以從其他地方下載。安裝過程按照提示點下一步直到完成即可。
2、解壓FirmUpdate_2.2.0.8.zip
3、從官網獲取SDK
4、固件加密和固件簽名
4.1使用CDK編譯工具
- 在tools/W80x/utilities/aft_build_project.sh文件中:
設置code_encrypt = 1表示使能固件加密;
設置signature = 1標識使能固件簽名;
將5個openssl.exe添加對應的安裝路徑;
設置固件加密秘鑰參數,參數長度為16字節,比如下圖中使用的是0~F這16個十六進制數字,則在.sh文件中參數位置寫的是對應的ASCII碼;
- 在tools/W80x/ca/key.txt文件中:
修改為對應的固件加密key值,長度為16字節數據;
- 在tools/W80x/ca/cakey.pem和capub.pem文件中:
cakey.pem是RSA簽名私鑰,用於openssl簽名固件,capub.pem是公鑰,用於解簽,將兩個文件裡的內容替換為自己的公私鑰。
4.2使用make編譯工具
- 在tools/w800/.config文件中:
設置 CONFIG_W800_IMAGE_SIGNATURE = 1,使能固件簽名;
設置CONFIG_W800_CODE_ENCRYPT = 1,使能固件加密;
在tools/w800/rules.mk文件中:
如下圖位置,修改固件加密使用的key,長度為16字節數據轉換為對應的ASCII字符串;
- 在tools/w800/ca/key.txt文件中:
修改為對應的固件加密key值,長度為16字節數據;
- 在tools/800/ca/cakey.pem和capub.pem文件中:
cakey.pem是RSA簽名私鑰,用於openssl簽名固件,capub.pem是公鑰,用於解簽,將兩個文件裡的內容替換為自己的公私鑰。
5、防拷貝判斷
SDK demo中的Avoid_Copy_Firm接口為參考實現,主要流程為讀取當前芯片的Flash Unique ID,讀取ID加密後的數據,解密對比是否一致,若不一致則中斷程序運行。可以將該接口放在mian函數的起始位置或者關鍵路徑。
示例中有三個地方用戶可以自定義,對應於燒錄工具用例中的修改,即:解密方式、加密數據存儲位置、秘鑰。
- 解密方式:芯片提供了硬件加解密的功能,能實現rc4、aes、des、3des的加解密,如果采用了其他的加密方式,則需要自己實現相關的解密功能;
- 加密數據存儲位置:需要和燒錄工具AvoidCopyTestCase用例中的Location參數一致;
- 秘鑰:需要和燒錄工具AvoidCopyTestCase用例中的Key參數一致,demo中直接用數組的方式指定了秘鑰,也可以是存放在flash中的某個位置去讀取;
6、固件燒錄
- 將編譯後的固件複制到燒錄工具文件夾內;
- 用自己的capub.pem替換工具文件夾中的已有文件;
- 在ToolConfig.ini文件中:
修改TestCaseConfig=AvoidCopyTestCases.xml,此處以防拷貝燒錄為例,如果還需要其他測試功能,可以參考《WM_W800批量燒錄工具具體操作指南_V2.1.doc》進行用例組合;
添加設備端口號至COMS Layout;
保存關閉,如果已打開工具,需要關閉工具後重新打開,配置才能生效;
- 在AvoidCopyTestCases.xml文件中:
倒數第三個用例AvoidCopyTestCase的功能為讀取DUT的Flash Unique ID,用參數Key的值做為秘鑰進行AES128 ECB加密,將加密結果寫入參數Location指定的位置。需要與步驟5中的三個地方對應:
加密方式:工具使用的加密方式為AES128 ECB,如果想采用其他的加密方式需要提出需求對工具進行修改;
加密秘鑰,需要和加密方式對應,如果采用默認的AES128 ECB加密,那麼秘鑰的長度為16字節,轉化為對應的ASCII字符串,如示例中的秘鑰為0~F這16個十六進制數轉化為對應的ASCII字符串;
保存位置,加密後的數據保存位置。
- 修改最後的FirmUpdateTestCase用例中固件的名字,與複制的固件名字一致,保存關閉;
打開FirmUpdate.exe,勾選設備端口號,拉低boot(PA0),按下reset,開始燒錄固件,燒錄完成後會提示成功或者失敗;
拉高boot,按下reset複位設備,即可驗證防拷貝功能是否生效。
7、注意事項
如果在開發驗證階段使用了FirmUpdate.exe燒錄了防拷貝固件,後續想燒錄不帶防拷貝功能的固件,則需要修改AvoidCopyTestCases.xml中倒數第四個用例WriteSignEnableTestCase中的參數Enable改為0,同時WriteDebugLevelTestCase的調試級別改為0,燒錄固件後即可。之後就可以使用Upgrade Tools工具正常燒錄固件。
學習了