导言
跟着计算机运用的不断发展,安全要挟问题越来越严峻,传统的单纯依托软件来反抗安全要挟往往不能解决问题。可信计算的根本思想是从芯片、硬件结构和操作体系等方面拟定安全标准确保计算机和网络结构的安全。可信计算渠道依据可信渠道模块(TPM),以暗码算法技能作为基础、安全操作体系作为中心,经过信赖域的不断扩展构成安全的渠道。
现在市场上的TPM芯片首要运用在PC终端上,可是跟着嵌入式体系的不断发展,TPM在嵌入式体系上的运用也越来越广,程序员在编写可信计算运用程序的时分,其切入点应该是TSS,本文就TPM和TSS的概念、TSS在ARM渠道上的移植、调用TSS的API编写运用程序以及怎么与TPM进行交互做了详细的介绍,终究完成了在嵌入式ARM渠道上的可信计算。
TPM芯片结构和TSS体系结构概述
可信计算的中心是TPM,它是一种安全加密芯片,供给了一种依据硬件的方法来办理用户权限、网络拜访、数据维护等。TPM芯片用来存储数字密钥、认证和暗码,有了TPM不管是虚拟的仍是物理的进犯都将变得愈加困难。如图1所示,TPM芯片首要由以下几部分组成:I/O组件、非易失性存储、身份密钥、程序代码、随机数发生器、Sha-1算法引擎、RSA密钥发生、RSA引擎、Opt-In挑选组件、履行引擎。
图1 TPM芯片结构
TPM芯片里的资源是有限的,它只是对外供给了一些根本的功用接口。为了充沛运用TPM的内部功用,需求在TPM外部套接一个可信计算软件栈TSS,TSS作为可信计算渠道上TPM的支撑软件,其标准界说了一种能够让拜访TPM变得简略和直接的体系结构。本文构建的嵌入式渠道为三星的ARM9TDMI-S3C2410处理器,TPM芯片为Atmel公司的AT97SC3204T。
由图2可知,TSS的运转形式分为两种:用户形式和内核形式。用户形式下,一般依据用户的要求来加载和履行用户运用程序和服务,有时分这些用户运用程序和服务也能够作为发动服务被载入。在内核形式下,一般运转设备驱动和操作体系的中心组件。
图2 TSS体系结构
TSS由三个逻辑组件构成:TCG设备驱动程序库(TCG Device Driver Library,TDDL)、TSS中心服务(TSS Core Services,TCS)、TCG服务供给者(TCG Service Provider,TSP)。
TDDL供给了一个与TPM设备驱动程序进行交互的API的库,用来翻开和封闭TPM设备驱动程序(TPM Device Driver)、发送和接纳数据块、查询设备驱动程序的特点、撤销现已提交的TPM指令。TCS层首要用来办理TPM的资源,供给了一个TPM指令数据块发生器和一个大局的密钥存储设备。TSP层经过同享方针或动态链接库直接被运用程序调用。
TSS的作业流程如下:运用程序的指令参数经过接口TSPl发送到TSP,TSP经过处理后传送给TCS,TCS将接纳到的恳求转化为TPM能够辨认的字节省,经过TDDL和TDD传给TPM,然后反向经TDDL、TDD、TCS、TSP传回运用程序。
TSS在ARM上的移植
本文所运用的宿主机操作体系为Fedora,穿插编译东西为arm-linux-gcc。
TSS在ARM上的移植分为3部分:穿插编译OpenSSL、穿插编译TSS、制造包括TSS的文件体系。在穿插编译TSS之前,先穿插编译装置OpenSSL,由于穿插编译TSS的时分需求用到其间的libcrypto库文件,其流程如图3所示:
图3 TSS在ARM上的移植进程
穿插编译OpenSSL
本文所运用的OpenSSL详细版别为1.0.0,在穿插编译之前需求进行如下操作:
(1)装备:在对OpenSSL1.0.0进行装备时需求指定其装置途径,在后面装备TSS时需求调用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,在穿插编译之前需求进行如下操作:
(1)履行bootstrap.sh脚本,详细指令如下:
[root@happy trousers-0.3.3.2]#sh bootstrap.sh
(2)对软件包进行装备,指令如下:
[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地点的方位,穿插编译的时分需求用到其间的libcrypto库文件;–prefix=/usr/tss指定装置方位。
包括TSS的文件体系制造
文件体系在宿主机上的目录为~/rootfs,将穿插编译装置好的TSS(在宿主机上的方位为/usr/tss)拷贝到~/rootfs/usr下,将TSS装置后生成的库文件拷贝到~/rootfs的lib目录下。
然后运用文件体系制造东西mkcramfs1.0,将目录rootfs制造成镜像文件,经过串口东西minicom下载到ARM开发板。
假如TSS发动成功,则会呈现如下提示:TCSD trousers 0.3.3.2:TCSD up and running。
注意事项
在制造文件体系时,~/rootfs/etc中需求增加关于TSS的group、passwd文件,hosts里边应该包括localhost。不然,制造成文件体系烧写进开发板之后,当输入#./usr/tss/sbin/tcsd-f发动TSS时,会报错。
将不期望用户修正的文件都放在只读的cramfs分区下,修正初始化脚本liunxrc,将TSS地点的目录挂载为yaffs格局。别的下文中将要用到的/tmp目录也要挂载为yaffs格局,确保可读可写。
运用程序编写
在完成了TSS在ARM渠道的移植之后,能够运用TSS所供给的API编写运用程序与TPM进行交互。下面首要介绍一下获取属主身份、创立密钥、对文件进行加密和解密。
属主身份获取
初次运用TPM时,需求先获取属主身份,首要用到函数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 属主身份获取
密钥创立
对文件进行加密时需求运用密钥,这能够运用函数Tspi_Key_CreateKey()来创立,示例代码如下:
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! );
创立密钥之前/tmp目录下的文件只需dir,创立成功后会打印信息,并生成密钥文件UserKeyBlob.cer,如图5所示:
图5 密钥创立
文件加密
加密操作首要运用函数Tspi_Data_Bind(),示例代码如下:
TSS_RESULT rc=Tspi_Data_Bind(hEncdata,hKey, strlen(testCipher),(unsigned char*)testCipher);
if(result !=TSS_SUCCESS)
{
fprintf(stderr,Tspi_Data_Bind: %s ,Trspi_Error_String(rc));
goto out_close;
}
穿插编译后生成指令encryptFile。假如要加密的文件为/tmp/dir/test,前面创立的密钥地点的目录为/tmp,则编译后履行指令时的格局为encryptFile -e /tmp/dir /tmp。
加密之前,/tmp/dir目录下只需test一个文件,运用cat指令检查该文件的内容为:Hello,world!履行加密指令之后,运用cat指令再次检查该文件的内容,看到的是乱码,而不是原始内容,可见加密成功。加密后在test文件地点的目录下会生成一个FileKey.cer文件。如图6所示:
图6 文件加密
文件解密
解密操作运用函数Tspi_Data_Unbind(),示例代码如下:
TSS_RESULT rc=Tspi_Data_Unbind(hEncdata,hKey, unsealedDataLength, unsealedData)
if(rc!=TSS_SUCCESS)
{
fprintf(stderr,Tspi_Data_Unbind: %s ,Trspi_Error_String(rc));
goto out_close;
}
解密文件和加密文件运用的是同一个指令,但后缀参数不同,格局为encryptFile –d /tmp/dir /tmp。履行解密操作后,运用cat指令检查加密的文件test,则能够看到原始的内容,阐明解密成功。此刻,test文件地点的目录下加密时生成的FileKey.cer文件消失。如图7所示:
图7 文件解密
除了上面的几个示例之外,还能够调用TSS的API编写各种运用程序对TPM进行操作。总归,只需给定了TPM芯片,把握了TPM的根本知识和TSS的API,就能够写出可信计算的运用程序。
结束语
传统的可信计算一般是依据PC渠道的,本文经过可信计算软件栈TSS在ARM渠道上的完成,调用TSS的API编写运用程序与TPM进行交互,关于完成可信计算在嵌入式ARM渠道上的运用供给了重要的桥梁和支撑。