目前越來越多的微控器(MCU)應用需要使用到復雜的算法及中間件解決方案(middlewaresolution),因此,如何保護軟件方案商開發(fā)出來的核心算法等知識產權代碼(IP-Code),便成為微控制器應用中一項很重要的課題。因為這一重要的需求,AT32WB415系列提供了安全庫區(qū)(SLIB)的功能,以防止重要的IP-Code被終端用戶的程序做修改或讀取,進而達到保護的目的。本文檔將詳細闡述AT32WB415系列安全庫區(qū)的應用原理和軟件使用方法。
應用原理
安全庫區(qū)的應用原理
- 設定以密碼保護指定范圍的程序區(qū)(即安全庫區(qū)),軟件方案商可將核心算法存放到此區(qū)域,以達到保護的功能,其余空白程序區(qū)可以提供給終端商客戶進行二次開發(fā)。
- 安全庫區(qū)劃分為指令安全庫區(qū)(SLIB_INSTRUCTION)及數(shù)據(jù)安全庫區(qū)(SLIB_DATA),并可選擇部分或是整個安全庫區(qū)存放指令,但不支持整個安全庫區(qū)存放數(shù)據(jù)。
- 指令安全庫區(qū)(SLIB_INSTRUCTION)內的程序代碼僅能被MCU透過I-Code總線抓取指令(僅能被執(zhí)行),不能透過D-Code總線以讀取數(shù)據(jù)的方式讀取(包含ISP/ICP調適模式以及從內部RAM啟動的程序),以讀取數(shù)據(jù)的方式去訪問SLIB_INSTRUCTION時,讀到的數(shù)值全都是0xFF。
- 數(shù)據(jù)安全庫區(qū)(SLIB_DATA)的數(shù)據(jù)僅能透過D-Code總線讀取,不能寫入。
- 安全庫區(qū)的程序代碼及數(shù)據(jù),除非輸入正確的密碼,否則無法被擦除。在密碼不正確時,對安全庫區(qū)執(zhí)行寫入或擦除,將會在FLASH_STS寄存器的EPPERR位置"1"提出警告。
- 終端用戶執(zhí)行主閃存的整片擦除時,安全庫區(qū)的程序代碼及數(shù)據(jù)不會被擦除。
- 當安全庫區(qū)的保護功能被啟動后,可以透過在SLIB_PWD_CLR寄存器寫入先前設置的密碼來解除保護功能。解除安全庫區(qū)的保護時,芯片將會執(zhí)行主閃存的整片擦除(包含安全庫區(qū)的內容)。因此即使軟件方案商設置的密碼被泄漏,也不會有程序代碼外泄的疑慮。
下圖是包含安全庫區(qū)的主閃存區(qū)映射示意圖,安全庫區(qū)的程序代碼可以很容易地被終端用戶調用并執(zhí)行, 但不能直接被讀取,因而達到保護的功能。圖1. 帶有安全庫區(qū)的主閃存區(qū)映射
安全庫區(qū)的范圍大小是以扇區(qū)(sector)為單位做設定,每一扇區(qū)的大小以實際MCU型號為準。表1是AT32WB415系列各型號的主閃存大小、每扇區(qū)大小及可設置范圍。另外啟動程序代碼區(qū)開啟了主存擴展功能后,整個18KB區(qū)域也是可以作為安全庫區(qū)。表1. AT32WB415各型號閃存大小總表
如何啟動安全庫區(qū)保護
默認狀態(tài)下,安全庫區(qū)設定寄存器始終是不可讀且被寫保護。要想對安全庫區(qū)設定寄存器進行寫操作,首先要對安全庫區(qū)設定寄存器解鎖,對SLIB_UNLOCK寄存器寫入解鎖0xA35F6D24值,通過查看SLIB_MISC_STS寄存器的SLIB_ULKF位確認解鎖成功,隨后便允許對安全庫區(qū)設定寄存器寫入設定值。啟動主閃存安全庫區(qū)的步驟如下:
- 檢查FLASH_STS寄存器的OBF位,以確認沒有其他正在進行的閃存操作;
- 對SLIB_UNLOCK寄存器寫入0xA35F6D24,以進行安全庫區(qū)解鎖;
- 檢查SLIB_MISC_STS寄存器的SLIB_ULKF位,以確認解鎖成功;
- 在SLIB_SET_RANGE寄存器設定要保護的區(qū)域,包含指令區(qū)與數(shù)據(jù)區(qū)的地址;
- 等待OBF位變?yōu)椤?’;
- 在SLIB_SET_PWD寄存器設定安全區(qū)域密碼;
- 等待OBF位變?yōu)椤?’;
- 燒錄將存入安全庫區(qū)的代碼;
- 進行系統(tǒng)復位,重裝載安全庫區(qū)設定字;
- 讀出SLIB_STS0/STS1寄存器用于判斷安全庫區(qū)設定結果。
注意事項:
- 只可在主閃存中設置安全庫區(qū),實際可設置范圍參見表1;
- 啟動程序代碼區(qū)中設置安全庫區(qū)(需開啟AP模式),設置范圍為整個啟動程序代碼區(qū);
- 主閃存和啟動程序代碼區(qū),安全庫區(qū)只能設置其中一個,不可同時設置;
- 安全庫區(qū)代碼必須以扇區(qū)為單位進行燒錄,且起始地址必須與主閃存地址對齊;
- 中斷向量表是數(shù)據(jù)型態(tài)且通常會被放置在閃存的第一扇區(qū)(扇區(qū)0)內,請勿將閃存的第一扇區(qū)設定為安全庫區(qū);
- 要被安全庫區(qū)保護的程序代碼,不可放置在閃存的前4KB內;
關于安全庫區(qū)設定寄存器的詳細說明,請參閱AT32WB415系列技術手冊。啟動安全庫區(qū)的程序可參考安全庫區(qū)應用范例project_l0中位于main.c中的slib_enable()函數(shù)。亦可使用雅特力的ICP或ISP刻錄工具做設定,后面章節(jié)將會有詳細的說明。
如何解除安全庫區(qū)保護
當安全庫區(qū)的保護功能被啟動后,可以透過在SLIB_PWD_CLR寄存器寫入先前設置的密碼來解除保護功能。解除安全庫區(qū)的保護時,芯片將會執(zhí)行主閃存的整片擦除(包含安全庫區(qū)的內容)。解除主閃存安全庫區(qū)的步驟如下:
- 檢查FLASH_STS寄存器的OBF位,以確認沒有其他正在進行的編程操作;
- 在SLIB_PWD_CLR寄存器寫入先前設置的安全區(qū)域密碼;
- 進行系統(tǒng)復位,重裝載安全庫區(qū)設定字;
- 讀出SLIB_STS0寄存器用于判斷安全庫區(qū)設定結果。
編排及執(zhí)行安全庫區(qū)的程序
如前面章節(jié)所提到,在指令安全庫區(qū)(SLIB_INSTRUCTION)內的的程序代碼可以被MCU經(jīng)由I-Code總線抓取,但不能經(jīng)由D-Code總線以讀取數(shù)據(jù)的方式去讀出,這樣的保護是全面性的,也就是說在指令安全庫區(qū)之內的程序代碼,也不能讀取同樣被放置在指令安全庫區(qū)之內的數(shù)據(jù),例如C程序代碼常被編譯成的文字池(literal pool)、分支表(branch table)或常數(shù)(constant)等之類當指令被執(zhí)行時會經(jīng)由D-Code總線去讀取的數(shù)據(jù)。這代表指令安全庫區(qū)之內只能放置指令,不能放置任何數(shù)據(jù)。因此用戶在編排要放置在指令安全庫區(qū)之內的程序代碼時,必須配置編譯程序(compiler)的設定去產生只執(zhí)行(execute-only)的代碼以避免上述那些型態(tài)的數(shù)據(jù)產生。圖2及圖3是一般常見的文字池跟分支表的例子:switch()是C程序中常用的跳轉指令,此例子中的sclk_source變量是去讀取CRM_CFG寄存器,圖2可看到編譯出來的匯編代碼(assembly code)“LDR R7, [PC, #288]”,會用程序計數(shù)器(program counter, PC)間接尋址的方式去取得CRM_CFG寄存器的地址,而CRM_CFG的地址會被以常數(shù)的方式存放在鄰近的指令區(qū)(也在指令安全庫區(qū)之內),因此執(zhí)行switch()指令時就會發(fā)生數(shù)據(jù)的讀取。如果指令安全庫區(qū)內有這類的程序代碼,在執(zhí)行的時候就會產生錯誤。AN0127第三章的范例程序將會說明如何設定編譯程序的配置來避免這樣的問題。圖2. 文字池例子(1)
圖3. 文字池例子(2)
一、不可將中斷向量表設置為安全庫區(qū)
中斷向量表包含每個中斷處理程序的入口點地址,由MCU通過D-Code總線讀取。通常,中斷向量表位于主閃存第一扇區(qū)(sector 0)的起始地址0x08000000,因此在設置指令安全庫區(qū)時,必須遵守以下的規(guī)則:
- 不可將主閃存的第一扇區(qū)設置為安全庫區(qū)
- 要被安全庫區(qū)保護的程序代碼,不可放置在閃存的第一扇區(qū)內
二、安全庫區(qū)代碼與用戶區(qū)代碼的關聯(lián)性
受安全庫區(qū)保護的程序代碼(IP-code)可以從位于用戶代碼區(qū)(安全庫區(qū)之外的區(qū)域)的函數(shù)庫中調用函數(shù)。在這種情形下,IP-Code將會包含這些函數(shù)的地址,允許PC(程序計數(shù)器)在執(zhí)行IP-Code時跳轉到這些函數(shù)。一旦安全庫區(qū)被啟動,這些函數(shù)的地址就不能被改變,此時,這些位于用戶代碼區(qū)的函數(shù)的地址就必須固定下來,否則PC將跳轉到錯誤的地址而無法正常工作。因此在設置安全庫區(qū)的時候,應該將所有與IP-Code相關聯(lián)的函數(shù)都一起編排到安全庫區(qū)之內以避免此情況發(fā)生。下圖顯示出一個被保護的函數(shù)Function_A()調用到用戶區(qū)內的函數(shù)Function_B()的例子。圖4. 安全庫區(qū)的函數(shù)調用用戶區(qū)函數(shù)的例子
此外,另一個最常見的情形就是使用到C語言的標準函式庫,例如memset()及memcpy()這類函數(shù)。如果IP-Code跟用戶區(qū)代碼都有調用到這類函數(shù),就會有上述問題的困擾。列舉兩種常用的解決方法:1) 將其編譯到安全庫區(qū)范圍內,具體如何實現(xiàn)可以查看keil或IAR的相關文檔。2) 避免在IP-Code內使用C的標準函式庫,若非要使用,就必須將用到的函數(shù)改寫為其他名稱,以下是一個范例,在IP-Code中寫一個my_memset()函數(shù)取代原先的memset()。圖5. 自定義函數(shù)范例
三、軟件浮點運算庫的使用與編排
由于AT32WB415沒有硬件符點運算單元(FPU),所以項目中如有符點數(shù)運算,Keil或IAR編譯程序就會使用ARM提供的軟件浮點運算庫函數(shù)。但因為軟件浮點運算庫函數(shù)是已經(jīng)編譯過的代碼,無法做修改,且其中有些函數(shù)內會有如同前面章節(jié)提到的文字池格式的代碼,所以不能將浮點運算庫函數(shù)一起編排到SLIB_CODE保護區(qū)之內,必須放到安全庫區(qū)之外。如下圖中Keil浮點運算庫中的除法函數(shù),就有文字池格式的匯編代碼。圖6. 除法函數(shù)匯編代碼
當sLib啟用后,sLib保護區(qū)內的全部內容就不能被改動,所以SLIB_CODE調用到的每個浮點運算庫函數(shù)的地址也就不能被改變。第三章的范例將會說明如何將使用到的浮點運算庫函數(shù),編排到SLIB-CODE保護區(qū)外且固定地址的區(qū)域,在啟用SLIB保護之后,讓SLIB-CODE保護區(qū)內的程序可以正確無誤的調用。Keil軟件浮點運算庫的詳細說明,可參考安裝目錄下的ARM DUI0378G文檔《ARMCompiler v5.06 for μVision ARM C and C++ Libraries and Floating-Point SupportUser Guide》。IAR軟件浮點運算庫的詳細說明,可參考安裝目錄下的EWARM_DevelopmentGuide文檔《IAR C/C++ Development Guide》的PREBUILT RUNTIME LIBRARIES章節(jié)。
-
微控器
+關注
關注
0文章
7瀏覽量
7222 -
雅特力
+關注
關注
1文章
195瀏覽量
9467 -
AT32
+關注
關注
1文章
121瀏覽量
3214
發(fā)布評論請先 登錄
AT32WB415射頻測試
雅特力科技通過ISO 26262汽車功能安全ASIL D認證
工業(yè)級MCU雅特力AT32F455RCT7核心技術解析
AT32WB415推動無線技術集成革新
雅特力AT32 MCU推動低空經(jīng)濟發(fā)展
喜訊!雅特力科技榮獲“2025年度優(yōu)秀電機控制技術產品獎”
喜訊!雅特力科技榮獲“電機創(chuàng)新設計先鋒企業(yè)”
活動預告|雅特力與您相約2025電機控制先進技術研討會
雅特力AT32F413芯片推動洗衣機節(jié)能升級
雅特力AT32F421吊扇控制芯助力綠色節(jié)能
雅特力AT32F421定義高速吹風機控制新標準?
雅特力MCU智能監(jiān)測系統(tǒng)為電鉆提供全鏈路保護
??雅特力AT32F435:240MHz多軸伺服控制成本最優(yōu)解?
雅特力科技精彩亮相2025 MCU及嵌入式技術論壇
雅特力AT32WB415 Security Library使用指南
評論