宮 健,裴煥斗,唐道光
(1.中北大學儀器與電子學院,山西太原 030051;2.山西百信信息技術有限公司,山西太原 030006)
可信計算是保障設備運算按照預期執行的技術,而安全可信的計算環境由硬件平臺和操作系統共同組成[1],可信計算的核心思想是在執行安全防護的同時進行運算[2]。我國進入可信計算3.0時代后,提出了主動防御思想,意在對系統實施主動監控,確保應用程序按照預期結果執行,使系統免于病毒、黑客威脅[3]。
可信計算的運算控制功能由處理器核實現,對于處理器性能而言,絕對的硬件水平不是第一位的,指令集架構同樣起到重要作用[4]。而在ARM和x86處于統治地位的同時,RISC-V 橫空出世,在世界各地及各種重要應用領域快速崛起。RISC-V 指令集易于移植,設計簡單方便,擁有完備的軟件開發工具鏈,方便進行嵌入式開發,并且完全開源,無任何知識產權問題,任何公司或個人均可以根據其架構進行處理器設計。這一特點很大程度上降低了處理器設計的準入門檻[5]。RISC-V 具有很好的穩定性,因為其基準指令確定后不再發生改變[6]。
基于以上背景,文中在平衡性能、功耗的情況下,設計了一種適用于可信計算領域的32 位RISC-V 架構處理器,通過了指令仿真測試,借助FPGA(Field-Programmable Gate Array)在國產操作系統深度下成功運行SM3 算法,并根據雜湊值計算比對結果,輸出對外部設備的主動控制信號。
文中采用無知識產權問題的開源指令集RISC-V設計適用可信計算的軟核處理器,其主要承擔設計的控制和運算功能,采用經典5 級流水線設計可以顯著提高運算速度,提升數據吞吐率[7]。通過設備總線外接密碼模塊的方式,令處理器支持符合可信標準的國產密碼算法SM3,處理器通過SPI(Serial Peripheral Interface)接口對密碼模塊進行調用,計算雜湊值,并與預存雜湊值比對,根據比對結果正確的與否,可信主動控制邏輯將生成不同的I/O(Input/Output)控制信號,對外部可信設備發出控制命令[8]。圖1 為系統整體設計框圖。

圖1 整體設計框圖
1.1.1 流水線設計
指令執行效率直接關系到CPU的運算性能,將一條指令的處理過程拆分為5 個階段,每個階段設計專門的硬件單元完成,在經過一段時間的“建立時間”后,每個時鐘周期每個單元保持滿負荷運行,從而大大提高指令執行效率[9]。流水線時空圖如圖2所示。

圖2 流水線時空圖
由圖2 可知,5 級流水線處理3 條指令花費7 個時間單位,相比串行執行花費15 個時間單位,效率顯著提高。相比2 級或3 級流水線執行階段時間過長的問題,采用5 級流水線硬件單元分布更均衡,吞吐率更高。處理器核總體設計如圖3 所示。

圖3 處理器核結構
取指階段包含簡單譯碼模塊,譯出所取指令是否為跳轉指令,這樣可以簡化電路單元設計,由于沒有配備硬件分支預測器,同時考慮到功耗影響,因此采用靜態分支預測方法,設定向后跳轉預測為需要跳轉,反之則不跳轉[10]。
譯碼階段依據RISC-V 指令結構完成對指令的解析,包括確定當前指令源操作數地址、寫回地址等,根據地址信息從通用寄存器組中取出所需操作數,并借助相關性檢查模塊確定指令是否存在數據相關。
執行階段主要負責普通運算指令的計算,如加減法、移位運算。多周期乘除法由專門運算單元完成。一般來說,32 位數據的除法需要花費32 個時鐘周期來完成。為了加快運算效率,采用兩位試商法計算,只需16 個時鐘周期即可完成,大大提高多周期指令的執行效率。這一階段對于訪存指令不作任何處理,直接送到訪存階段處理[11]。
訪存階段只進行訪存指令的地址計算及數據存取,對其余指令不作處理,直接送到下一階段即可。由于每個時鐘周期都需要取出一條指令,采用分離的指令存儲器和數據存儲器設計可以避免一個周期內產生兩個訪問請求,產生存儲器結構沖突。
寫回階段將指令計算結果按序送回通用寄存器,完成指令的最后處理。
1.1.2 數據相關處理
提高流水線級數在提升處理器性能的同時,也不可避免地引發了數據相關問題。由于該設計使用的是順序處理器,所以存在寫后讀相關,即假設指令x比指令y先進入指令隊列,而指令y需要指令x的計算結果,但指令x需要經過寫回階段寫入通用寄存器,指令y才能讀到正確的數值,如此在鄰近指令中便產生了數據相關。
為此,該設計采用定向前推技術來解決流水線中的數據相關問題,即不等待數據被寫回通用寄存器,在相關數據產生時就將數據定向前推至所需單元[12]。譯碼-執行相關解決方法如圖4 所示。

圖4 定向前推過程
指令x在執行階段結束就計算出了寫回結果,按流水線進行,需等待寫回階段結束才能得到計算結果,可以在執行階段結束將結果直接送入譯碼階段,這樣就避免了譯碼-執行相關。同理,譯碼-訪存相關、譯碼-寫回相關也可以通過這樣的方式來解決。判斷是否存在譯碼-執行相關的代碼如下:

對于加載指令,從數據存儲器中讀出結果才可以送回譯碼階段,所以當譯碼模塊檢測到當前是訪存指令后,流水線需要暫停一個時鐘周期,至訪存階段取出數據,送回譯碼階段,否則會出現錯誤。
該設計外設部分通過SPI 接口外接密碼模塊,支持可信標準SM3 算法,具有可移植性強的優點。密碼模塊完成SM3算法的執行及計算結果的比對功能,最終通過可信主動控制邏輯實現對電源接口和IO接口的控制,完成對外部可信設備的控制與度量。UART(Universal Asynchronous Receiver/Transmitter)接口用來發送接收數據,在深度系統終端上打印計算比對結果。GPIO(General-Purpose Input/Output)擴展接口作為處理器的JTAG(Joint Test Action Group)接口,完成對處理器的調試下載功能[13]。總線地址分配如圖5 所示。

圖5 總線地址分配
SM3 算法是我國自主設計的密碼算法,安全性高,全稱為SM3 密碼雜湊算法,其本質上是一種哈希算法[14]。對于長度小于264bit的數據,SM3 算法能將其轉化為256 bit的哈希值。其主要流程如下:
1)填充
首先在長度為X的數據后添加1 個“1”和Y個“0”,使其滿足1+X+Y=448mod512,其中Y取最小非負整數[15]。最后,將表示X長度的64 位2 進制比特串添加至數據末尾,構成n組512 比特的數據格式。數據“ab”的填充結果如圖6 所示。

圖6 數據填充結果
2)迭代壓縮
將填充后的消息劃分為n組,每組長度為512 bit,例如消息“ab”只有1組,n取(X+Y+65)/512。

將填充后的消息進行迭代:

其中,CF是壓縮函數,V(0)為256 bit 初始值IV:7380166f_4914b2b9_172442d7_da8a0600_a96f30bc_163138aa_e38dee4d_b0fb0e4e。
3)消息擴展
將消息分組B(i)(256 bit)進行擴展生成132 個字(132×32=4 224 bit)。
W0至W15:消息分組平均劃分為W0至W15,共16個字;
W16至W67:

其中,P1為置換函數,⊕為異或運算,<<<為循環左移操作。置換函數算法步驟如下所示。

4)壓縮函數
A~H為8個32位寬數據,FFj、GGj為布爾函數,其余為中間變量,計算步驟如下所示:


設計完成后,對處理器進行指令驗證。通過Vivado 2020.1 加載.coe 文件至指令存儲器完成初始化,并修改仿真環境調用第三方工具Modelsim 進行仿真,完成處理器整數指令驗證。當pc為0時,取指階段取出的指令碼為002081b3,可以得知此為ADD 指令,譯碼階段取出的兩個操作數分別為1和2,這條指令在訪存階段不作操作。經過5 級流水后在寫回階段輸出結果為3,結果正確;經過一個時鐘周期后,pc加4,取出下一條指令為SLT,比較操作數1和操作數2的大小,由于操作數1大于操作數2,輸出結果為0,結果正確。對不同類型的指令進行仿真驗證后,結果均與預期一致,處理器功能正常[16]。部分仿真波形如圖7所示。

圖7 仿真結果
該設計借助Vivado 2020.1 軟件將比特流文件燒寫至FPGA 開發板,型號選擇XI-LINX Artix-7 系列的XC7A100T-2FGG484。在國產操作系統深度下,安裝GNU 工具鏈,配置下載器及flash 鏈接腳本,將SM3 算法程序燒錄至外接flash 中,輸入明文計算出256 bit 雜湊值,與程序內預存的雜湊值進行比對,最后通過可信主動控制邏輯實現對LED 燈的亮滅控制,并在終端上打印比對計算結果。終端打印結果如圖8 所示。

圖8 終端打印結果
該設計輸入abc 值模擬從外部可信設備中獲取的明文,通過計算比對,在結果正確的情況下控制FPGA 開發板的LED 燈,完成對IO 接口的控制。經驗證,處理器控制功能正常。
文中提出一種用于可信計算的RISC-V 處理器方案,對內核、外設以及算法原理進行了介紹。在國產操作系統深度下搭建交叉編譯環境,最終通過FPGA 實現軟件與硬件的交互。經過驗證,處理器能流暢執行SM3 密碼算法并完成雜湊值比對,輸出相關控制信號,達到預期目標,對可信計算領域有較高的應用價值。
未來將通過外接可信設備進行進一步驗證,并支持更多可信標準密碼算法,實現完備的可信計算體系。