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

圖1 TSP密鑰創(chuàng)建過(guò)程
經(jīng)過(guò)分析可知,TSS 中的密鑰管理涉及TSP 和TCS 兩層軟件結(jié)構(gòu)的通信,符合多用戶并行訪問(wèn)TPM 的要求,但相應(yīng)的軟件開(kāi)銷(xiāo)大,不適合嵌入式系統(tǒng)[16]。經(jīng)過(guò)對(duì)TSS 重要功能和結(jié)構(gòu)的分析,適用于嵌入式實(shí)時(shí)系統(tǒng)的可信軟件棧需要舍棄TSS 復(fù)雜的結(jié)構(gòu),并裁剪功能,重構(gòu)底層驅(qū)動(dòng)。基于嵌入式實(shí)時(shí)系統(tǒng)的可信軟件的需求如下:
1)設(shè)計(jì)從API 到命令流傳遞給TPM 的流程。
2)底層硬件交互按照TPM 命令設(shè)計(jì)規(guī)范。
3)簡(jiǎn)化TSP 層對(duì)象管理和TCS 層上下文管理等功能。
4)具有密鑰管理、授權(quán)管理、認(rèn)證和封裝等基本功能。
根據(jù)對(duì)TSS 軟件棧結(jié)構(gòu)和主要功能的分析,以及嵌入式可信軟件棧的需求分析,設(shè)計(jì)了一種圖2 所示結(jié)構(gòu)的可信軟件棧。簡(jiǎn)化TSS 復(fù)雜的三層結(jié)構(gòu),實(shí)現(xiàn)頂層應(yīng)用調(diào)用函數(shù)到成TPM 命令流的轉(zhuǎn)化,以命令構(gòu)造模塊為核心,依據(jù)可信計(jì)算中密鑰管理的機(jī)制,實(shí)現(xiàn)簡(jiǎn)單的密鑰管理和授權(quán)計(jì)算。

圖2 嵌入式可信軟件棧結(jié)構(gòu)
命令構(gòu)造模塊位于軟件棧的最上層,作為軟件棧的中樞,連接各個(gè)模塊,主要功能是將上層TPM 命令轉(zhuǎn)換成字節(jié)流,調(diào)用TPM 驅(qū)動(dòng),配合TPM 完成相關(guān)的動(dòng)作。整個(gè)流程如圖3 所示。

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

圖4 密鑰槽,軟件棧和TPM的調(diào)用關(guān)系
以createWrapFunc 函數(shù)的實(shí)現(xiàn)原理[17]闡述軟件棧密鑰管理過(guò)程、授權(quán)機(jī)制和密鑰槽工作的邏輯,密鑰生成過(guò)程如圖5 所示。授權(quán)會(huì)話的數(shù)據(jù)保存在數(shù)據(jù)類型為authSession_t 的數(shù)組authSession[]中,包含驗(yàn)證句柄和隨機(jī)數(shù),驗(yàn)證參數(shù)保存在OSAPparms 中,包含OSAP 的實(shí)體類型、值和驗(yàn)證值。

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

圖6 TPM命令
系統(tǒng)上電后,TPM 執(zhí)行命令之前,先執(zhí)行TPM_Startup 命令,TPM 返回TPM_SUCCESS,如圖7 所示。

圖7 TPM_Startup命令
根據(jù)上文敘述的密鑰邏輯啟動(dòng)系統(tǒng),可信環(huán)境建立之后,輸入創(chuàng)建EK 密鑰的命令,實(shí)驗(yàn)結(jié)果如圖8所示。

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