基于嵌入式ARM平臺的可信計算軟件棧的設計與實(shí)現
交叉編譯OpenSSL
本文所使用的OpenSSL具體版本為1.0.0,在交叉編譯之前需要進(jìn)行如下操作:
(1)配置:在對OpenSSL1.0.0進(jìn)行配置時(shí)需要指定其安裝路徑,在后面配置TSS時(shí)需要調用OpenSSL安裝路徑里的庫文件,并且需要指定交叉編譯工具,具體命令如下:
$/config--prefix=/usr/local/openssl os/compiler:arm-linux-gcc
其中--prefix=/usr/local/openssl指定安裝的路徑,
os/compiler:arm-linux-gcc指定編譯器arm-linux-gcc;
(2)修改Makefile,里面對應的部分需要修改為:
CC=arm-linux-gcc
EX_LIBS=-ldl
AR=arm-linux-ar $(ARFLAGS) r
RANLIB=arm-linux-ranlib
交叉編譯TSS
本文所使用的可信計算軟件棧為trousers0.3.3.2,在交叉編譯之前需要進(jìn)行如下操作:
(1)執行bootstrap.sh腳本,具體命令如下:
[root@happy trousers-0.3.3.2]#sh bootstrap.sh
(2)對軟件包進(jìn)行配置,命令如下:
[root@happy trousers-0.3.3.2]# /configure
--host=arm-linux --with-openssl=/usr/local/openssl --prefix=/usr/tss
其中--host=arm-linux指定目標平臺為ARM,并使用交叉編譯工具;--with-openssl=/usr/local/openssl指定OpenSSL所在的位置,交叉編譯的時(shí)候需要用到其中的libcrypto庫文件;--prefix=/usr/tss指定安裝位置。
包含TSS的文件系統制作
文件系統在宿主機上的目錄為~/rootfs,將交叉編譯安裝好的TSS(在宿主機上的位置為/usr/tss)拷貝到~/rootfs/usr下,將TSS安裝后生成的庫文件拷貝到~/rootfs的lib目錄下。
然后使用文件系統制作工具mkcramfs1.0,將目錄rootfs制作成鏡像文件,通過(guò)串口工具minicom下載到ARM開(kāi)發(fā)板。
如果TSS啟動(dòng)成功,則會(huì )出現如下提示:TCSD trousers 0.3.3.2:TCSD up and running。
注意事項
在制作文件系統時(shí),~/rootfs/etc中需要添加關(guān)于TSS的group、passwd文件,hosts里面應該包含localhost。否則,制作成文件系統燒寫(xiě)進(jìn)開(kāi)發(fā)板之后,當輸入#./usr/tss/sbin/tcsd-f啟動(dòng)TSS時(shí),會(huì )報錯。
將不希望用戶(hù)修改的文件都放在只讀的cramfs分區下,修改初始化腳本liunxrc,將TSS所在的目錄掛載為yaffs格式。另外下文中將要用到的/tmp目錄也要掛載為yaffs格式,保證可讀可寫(xiě)。
應用程序編寫(xiě)
在完成了TSS在ARM平臺的移植之后,可以使用TSS所提供的API編寫(xiě)應用程序與TPM進(jìn)行交互。下面主要介紹一下獲取屬主身份、創(chuàng )建密鑰、對文件進(jìn)行加密和解密。
屬主身份獲取
首次使用TPM時(shí),需要先獲取屬主身份,主要用到函數Tspi_TPM_TakeOwnership(),示例代碼如下:
TSS_RESULT rc=Tspi_TPM_TakeOwnership(a_hTpm, a_hSrk, NULL_HKEY);
if(rc!=TSS_SUCCESS)
{
fprintf(stderr,"Tspi_TPM_TakeOwnership:%s ", Trspi_Error_String(rc));
goto out_close;
}
printf("result is %d ",result);
return result;
如果獲取成功則返回值為0,如圖4所示:
圖4 屬主身份獲取
密鑰創(chuàng )建
對文件進(jìn)行加密時(shí)需要使用密鑰,這可以使用函數Tspi_Key_CreateKey()來(lái)創(chuàng )建,示例代碼如下:
TSS_RESULT result = Tspi_Key_CreateKey(hKey,hSrk,NULL_HOBJECT);
if(result!=TSS_SUCCESS)
{
fprintf(stderr,"Tspi_Key_CreateKey: %s ", Trspi_Error_String(rc));
goto out_close;
}
printf("create key success! ");
評論