劉棟,王東輝
(中國科學院大學聲學研究所,北京 100089)
目前,可信計算組織TCG(TCG 軟件棧)已經提出了從硬件、軟件到應用的完整可信平臺方案,面向通用計算機的可信系統已落地,主要基于TPM(Trusted Platform Module,可信平臺模塊)實現安全存儲、PCR(Platform Configure Register,平臺配置寄存器)、密碼和證書功能,通過可信軟件棧的支撐,提供可信服務[1-3]。對于Linux 嵌入式可信系統,如今研究的重點主要是可信計算機制與基于實時操作系統的物聯網設備的融合問題[4]。
通過對基于Linux 的可信軟件棧結構的分析,總結出TPM 硬件的軟件管理系統基本要素,設計一個具有可信軟件棧功能的輕量級可信軟件棧,實現RT-Thread 實時操作系統、軟件棧、TPM 芯片的交互,完成基于RT-Thread實時系統的可信平臺的實現。
根據TCG 規定的可信計算軟件棧(TSS)規范,可信軟件棧分為三層:TSP(TCG Service Provider,服務提供者)、TCS(TCG Core Service,核心服務層)、TDDL(TCG Device Driver Library,設備程序驅動庫)[5-6]。
TSP 層為上層應用提供接口函數,維護應用需要的數據對象[7-10]。TCS 層被設計成一個守護進程或服務,作為系統服務的一部分運行,獲取TSP 的命令,轉換為TPM 命令數據包發送給TDDL,完成與TPM 硬件交互。TDD 設備驅動屬于Linux 驅動。應用程序可以通過設備程序庫TDDL 與內核中的TPM設備驅動進行交互。
基于Linux 的可信軟件棧TSS 結構復雜、功能繁多,雖然解決了多用戶多應用在TPM 芯片上使用的問題,但是軟件開銷巨大[11],對于單用戶的嵌入式系統具有局限。此外,TSS 無法移植到基于實時操作系統的微系統中。
TSS中密鑰緩存管理算法(Key Cache Management)貫穿服務提供者層和核心服務層[12-13],結合TPM 硬件的密鑰菊花鏈式結構,實現密鑰管理。
在服務提供層,給TSS 上層的可信應用搜索需要加載密鑰的父密鑰,維護一個WK(Wrapping Key,包裝密鑰)的鏈表,鏈表上的每個節點代表WK 的密鑰句柄,所有TSP 的密鑰以一定的WK 作為父密鑰或者祖父密鑰[14]。TCS 協調多個同時來自TSP 的請求,交換密鑰的上下文(密鑰資源和會話)。當某個應用需要創建一個新的密鑰時,調用Tspi_Context_Create Object 函數,分配TSP 上下文。接著調用Tspi_key_CreateKey 函數,給對象傳入RSA 密鑰句柄,檢查相關信息。調用TCS 守護進程,將TPM 生成的密鑰數據復制進對象,完成TSS_OBJECT_TYPE_RSAKEY 類的對象創建。最后調用XX_loadkey,將密鑰添加到TSP 緩存[15]。整個流程如圖1 所示。

圖1 TSP密鑰創建過程
經過分析可知,TSS 中的密鑰管理涉及TSP 和TCS 兩層軟件結構的通信,符合多用戶并行訪問TPM 的要求,但相應的軟件開銷大,不適合嵌入式系統[16]。經過對TSS 重要功能和結構的分析,適用于嵌入式實時系統的可信軟件棧需要舍棄TSS 復雜的結構,并裁剪功能,重構底層驅動。基于嵌入式實時系統的可信軟件的需求如下:
1)設計從API 到命令流傳遞給TPM 的流程。
2)底層硬件交互按照TPM 命令設計規范。
3)簡化TSP 層對象管理和TCS 層上下文管理等功能。
4)具有密鑰管理、授權管理、認證和封裝等基本功能。
根據對TSS 軟件棧結構和主要功能的分析,以及嵌入式可信軟件棧的需求分析,設計了一種圖2 所示結構的可信軟件棧。簡化TSS 復雜的三層結構,實現頂層應用調用函數到成TPM 命令流的轉化,以命令構造模塊為核心,依據可信計算中密鑰管理的機制,實現簡單的密鑰管理和授權計算。

圖2 嵌入式可信軟件棧結構
命令構造模塊位于軟件棧的最上層,作為軟件棧的中樞,連接各個模塊,主要功能是將上層TPM 命令轉換成字節流,調用TPM 驅動,配合TPM 完成相關的動作。整個流程如圖3 所示。

圖3 軟件棧命令流調用機制
系統中導出了TPM 命令集合。應用調用命令,或在控制臺輸入命令即可完成相應的操作。
命令執行核心函數是commandhander。模塊中維護兩個關鍵的表:commandtable 和FunPtrtable。commandtable 包含命令和命令的屬性,FunPtrtable 包含命令實現的函數指針。當commandhandler 接收到上層命令時,執行如下流程:
Step1:如果收到的命令是TPM 相關命令,進入commandhander 函數,否則失敗。
Step2:根據命令名,在commandtable 中查找匹配的命令和命令屬性,在FunPtrtable 查找對應命令的函數指針。
Step3:根據命令屬性和授權屬性,使用相應命令模板初始化一塊1 024 Bytes 的IO Buffer。
Step4:通過命令函數指針發送相應的命令函數,結合命令數據信息和驗證完成一個命令。該過程中若觸發其他TPM 命令,則回到Step1 重新進入commandhander 函數。如果命令的執行涉及驗證,則調用授權句柄函數計算需要的授權信息。
Step5:IO Buffer 填充完畢,調用接口函數Transmitcommand。該函數調用驅動完成發送,并置TPM 忙狀態(ACKpolling)。
Step6:TPM 應答,Transmitcommand 從TPM 讀取數據,填充IO Buffer,返回上層應用。
基于RT-Thread 的可信軟件的核心功能是密鑰管理機制。密鑰管理實現的基礎是TPM 的密鑰管理機制,結合TPM 的密鑰管理機制,實現了密鑰和用戶的交互,應用通過接口函數即可進行與TPM 密鑰的操作。
2.2.1 TPM密鑰管理機制
慢性肺心病合并心力衰竭為臨床常見病、多發病,中老年為該疾病的好發群體,疾病發生率為0.46%[1]。發病快、進展迅速、死亡率高,在一定程度上影響了患者的生命安全[2]。該疾病不但對病患的肺血管造成損害,也會影響其心臟功能。繼而加大治療難度。為了全面分析對于慢性肺心病合并心力衰竭者開展整體護理的臨床效果,結合實際情況,本研究選擇2016年1月—2018年1月我院收治的100例慢性肺心病合并心力衰竭的患者為研究對象,并對部分患者開展整體護理,現將具體結果報告如下。
TCG 規定了TPM 的七種密鑰類型[17],在TPM 中以密鑰樹的形式存儲。存儲密鑰用菊花鏈的方式存儲其他密鑰,使用存儲密鑰的公鑰部分加密其他新的密鑰和頭信息。
2.2.2 輕量級軟件棧密鑰管理機制的實現
改進后的軟件棧對密鑰的管理做了簡化。結合授權會話機制、密鑰存儲機制、TSS 密鑰管理的一般原則實現簡單的密鑰管理,刪除復雜的對象管理和上下文的切換。實現密鑰管理的函數如下:createWrapFunc()創建一個新的密鑰,loadKeyFunc()加載一個密鑰,getPubKeyFunc()獲得一個密鑰公鑰,flushKeyFunc()清除密鑰。
其他與密鑰相關的命令用genericFunc()函數直接實現。這些函數的實現依據是TPM 硬件中密鑰樹管理機制和TSP 的密鑰緩存機制。在MCU 的flash中定義一段固定的空間作為密鑰槽,將TPM 生成的密鑰信息存儲在里面。當可信應用需要密鑰相關的操作時,直接在密鑰槽中搜索特定需求的密鑰。僅用很少空間(8 kbit)就簡化了TCS 需要實現的復雜過程。整個管理結構如圖4 所示。

圖4 密鑰槽,軟件棧和TPM的調用關系
以createWrapFunc 函數的實現原理[17]闡述軟件棧密鑰管理過程、授權機制和密鑰槽工作的邏輯,密鑰生成過程如圖5 所示。授權會話的數據保存在數據類型為authSession_t 的數組authSession[]中,包含驗證句柄和隨機數,驗證參數保存在OSAPparms 中,包含OSAP 的實體類型、值和驗證值。

圖5 密鑰生成過程
步驟說明如下:
1)1-3 表示輸入創建密鑰命令createWrapKey,經過命令模塊調用函數createWrapFunc;在密鑰槽中搜索密鑰作為父密鑰。
2)4-6 表示發 送TPM_OSAP命令創建授權會話,建立會話參數(即填充OSAPparms)。
3)7 表示TPM 創建會話并和一個驗證句柄關聯;產生隨機數和驗證句柄以及會話密碼shareSecret。
4)8-9表示接收到OSAP 命令的返回值,保存驗證句柄和隨機數;用同樣的方法產生會話密碼shareSecret;計算inAuth。
5)10-14表示發送給TPM 密鑰生成命令,TPM以密鑰槽中的密鑰作為父密鑰生成新的密鑰和密鑰句柄。
6)15 表示將新的密鑰和密鑰句柄存儲在密鑰槽中。
基于RT-thread 的可信系統運行在ST 公司Nucleo-64 boards 開發板和Atmel 公司AT97SC3205T開發套件上。Nucleo-64 boards 是ST 公司推出的以STM32F401RE 為微控制器的開發板,內核為Cortex-M4,FLASH 為512 kB,SRAM 為96 kB,主頻84 MHz。AT97SC3205T 開發套件上的TPM 模塊作為系統的可信模塊。
可信系統運行在RT-Thread 實時系統上。RTThread 是一種輕量級的實時操作系統,適用于以M3 和M4 為內核的微控制器。開發板通過USB 轉UART 連接PC 進行程序下載和串口通信。通過命令行組件FinSH,在串口控制臺中調試程序的運行狀態。
該方案設計的難點在于從TPM 驅動到密鑰管理、授權機制、命令的實現與RT-Thread 的結合,完成相應可信機制有關的工作。軟件棧和RT-Thread在keil 完成統一的編譯,下載到開發板中。命令模塊導出了可以獲得的命令,通過相關命令完成相關的動作,如圖6 所示。

圖6 TPM命令
系統上電后,TPM 執行命令之前,先執行TPM_Startup 命令,TPM 返回TPM_SUCCESS,如圖7 所示。

圖7 TPM_Startup命令
根據上文敘述的密鑰邏輯啟動系統,可信環境建立之后,輸入創建EK 密鑰的命令,實驗結果如圖8所示。

圖8 TPM_CreateEKPair命令
其中,EK 密鑰的公鑰為返回值偏移量38 Bytes開始后的256 Bytes 的信息。
通過實驗可以得出,輕量級的可信軟件棧可以正常結合RT-Thread 實時操作系統在STMF4 上運行,完成基本的可信計算相關功能。
在物聯網設備安全問題日益嚴峻的今日,可信計算作為一種行之有效的安全保障系統方案,正在逐步落實到各種設備和終端上。在分析了可信計算的TCG 可信軟件棧TSS 的基礎上,提出了一種適用于嵌入式系統的輕量可信軟件棧,設計了命令調用機制,實現了簡單的密鑰管理、授權計算等可信功能,并證明了其能夠在常見的微控制器上正常運行相關的可信計算命令。在下一步研究中,將進一步完善該軟件系統的相關性能,探索更多的應用場景。