基于TPM仿真器的可信计算实验平台设计
2013-10-16罗洪达董增寿
罗洪达,董增寿,杨 威
(太原科技大学电子信息工程学院,太原 030024)
可信计算是当前嵌入式应用和信息安全领域的研究热点。由于可信计算的保护范围涉及服务器、桌面工作站及各种嵌入式设备,可信平台模块(TPM)生产厂家不同,接口规范也不同。对于从事可信计算的研究人员来说,搭建硬件平台耗费时间长,步骤繁琐,常常需要自己编写或移植TPM驱动程序和TPM设备驱动库。实际上安全协议和证明机制并不涉及硬件方面的细节,只需要借助可信计算软件栈提供的接口,调用相应的函数即可。目前,系统介绍可信计算仿真方法的文献不多,很多研究者只是针对自己研究领域的需求做了局部仿真,并不适合于通用可信计算架构的仿真。文献[1]提出的基于USBKey的外挂仿真平台思路新颖,突破了TCG的架构,但也需要依赖硬件。可信计算软件仿真器最常用的工具是TPM_emulator,文献[2]对TPM_emulator的内部构成和工作原理进行了详尽的分析,但是TPM_emulator与上层TSS的接口以及使用方法并未说明。
在文献[2]基础上,本文介绍了仿真平台的搭建步骤:编译软件包、安装可执行文件和库文件、运行守护进程,编写测试程序。重点介绍了TPM仿真器的两种编程接口,其中TDDL接口适合底层开发,而TSPI接口适合协议研究和应用程序开发。最后给出了仿真实验平台的测试实例,应用程序能够正常访问TPM并获取TPM状态,说明仿真平台的功能完善,操作简便。
1 可信计算仿真平台的构成
1.1 TPM仿真器介绍
TCG的可信计算架构中,实际上只有TPM芯片涉及具体硬件。因此仿真环境的基础是对TPM芯片的仿真,但是上层的软件栈如何与TPM仿真器接口以及如何使用TPM仿真器仍然是需要重视的问题。硬件TPM通过逻辑电路和固件程序提供了密钥生成、随机数产生、密钥存储、平台配置信息存储、签名和验证等功能,因此TPM仿真器最基本的功能是用软件实现这些算法和功能。对于需要永久存储的部分,硬件TPM一般存储到闪存区,而软件TPM通过指定一个配置文件模拟永久存储区。另一方面,硬件TPM通过某种总线连接到CPU就可以工作,而TPM仿真器通过进程间通讯接口与上层软件通讯,TPM仿真器正常工作时不需要与用户进行交互因此常常以守护进程的形式运行于后台,并且被配置为开机启动。
本文所搭建的仿真平台,使用TPM_emulator作为仿真器。TPM_emulator由德国人MARIO Strasser开发,是目前广泛使用的TPM仿真器,该软件的特点是使用Cmake组织源代码,同时兼容Linux和Windows平台。它模拟了硬件TPM的功能,实现了常用的密码学算法,例如随机数发生、生成RSA密钥、数字签名等等。密码学算法主要由Cyrpto Module模块完成。另一方面,TPM Emulator Engine提供了与TCG兼容的指令流,通过指令流接收TPM指令,由密码学模块计算,并将结果通过指令流返回给上层调用者。
图1 TPM_emulaor工作原理图[3]Fig.1 TPM_emulaor principle diagram
由上图可见,TPM_emulator提供的接口灵活,具体有三种方式:(1)应用程序可以通过TDDL间接调用tpmd,这是推荐的方式,不仅简单,而且兼容性好,符合TCG接口标准,如果需要过渡到真实TPM,只需替换掉相应的TDDL链接库即可。(2)应用程序也可以直接访问tpmd,传统的方法是将tpmd作为字符设备,字符设备的驱动程序是tpmd_dev.ko,将其安装到内核后,会自动生成设备文件/dev/tpm,然后可以通过系统调用或C语言库函数对该设备文件进行读写操作。(3)最直接的方法是通过如下unix socket接口访问。
这种方式摒弃了设备文件、驱动程序,更最重要的是,TrouSerS默认支持该接口。
1.2 仿真环境软件栈
TCG软件栈(TCG Software Stack,TSS)又称为可信软件栈,是可信平台上 TPM的支撑软件[4]。TSS的主要作用是为操作系统和应用软件提供使用TPM 的接口[5]。
TPM仿真器自带的TDDL库接口函数只提供了最底层的访问方法,对于简单的指令应用程序开发者可以自行构建,但是大部分的可信计算应用都涉及授权会话协议、非对称密钥对等操作,自行构建TPM指令流冗长复杂,也不利于应用程序移植。最好的方法是利用上层TSS软件栈的可信计算服务提供者接口(TSPI),以面向对象的方式操作TPM实现可信计算的功能。
TCG只给出了软件栈的函数名称和参数定义,TrouSerS是IBM公司开发的可信计算软件栈,是对TCG规范的一个实现。该软件包括了可信计算核心服务的守护进程tcsd,主要实现可信计算核心服务层的功能,同时为应用层访问提供接口。
tpm-tools和tpmmanager是两个应用层的实现。tpm-tools主要用来管理TPM,例如设置所有者、设置SRK密码、进行加密解密操作等等。而tpmmanager提供了最基本的TPM管理功能,主要用来查看、设置TPM的状态,tpmmanager的特点是提供了图形用户界面,比较适合开发实际的可信应用程序。这两个应用层的程序不仅仅提供了演示功能,更为应用程序开发者提供了代码框架;该软件包也可作为实例程序供初学者学习研究。
TCG架构下的可信软件栈与仿真环境软件栈对应关系如图所示。
图2 可信软件栈与仿真环境的对应关系图Fig.2 Relationship between Trusted software stack and corresponding simulation environment
2 仿真环境编译和使用方法
整个仿真环境所依赖的软件和库文件如图3所示。除了上述介绍过的TPM_emulator、TrouSerS、tpm-tools和tpmmanager之外,仿真平台还依赖其他一些软件包以提供编译辅助、数学库函数、图形界面等方面的支持:
图3 仿真环境软件包依赖关系图Fig.3 Simulation software package dependencies
GNU M4是一系列的宏函数,为其他算法程序库提供支持。
GMP是开源的数学运算库,它可以用于任意精度的数学运算,包括有符号整数、有理数和浮点数。它本身并没有精度限制,只取决于机器的硬件情况。GMP的安装需要GNU M4的支持。
Cmake用来编译TPM_emulator工程,进行环境变量设置、编译器设置,并产生Linux下的Makefile文件。
qmake-qt4是 Qt工程管理工具。tpmmanager具有图形界面,可以直观、方便的查看和设置TPM的状态,tpmmanager安装依赖 Qt支持,需要安装qmake-qt4.
编译安装过程。首先将软件包解压,然后执行#./configure命令配置编译环境,执行#make命令进行编译,执行#make install命令安装。编译GNU M4和GMP的时候需要用#make check命令对编译结果进行检测,确保数学运算的正确性。由于TPM_emulator使用Cmake工具组织源文件,因此编译流程有所不同,Tpm_emulator源码目录中提供了./build.sh,直接执行该脚本文件即可完成编译。
编译安装完成后,启动仿真器的命令为:
其中,-f参数表示强制tpmd在前台运行,-d参数表示输出调试信息。clear表示 TPM的启动方式。
启动核心服务层的命令如下:
其中,-f参数同样表示tcsd在前台运行,-e参数表示使用socket接口与tpmd进行通讯。这两个守护进程成功运行的截图见4.1节图5、图6.
3 仿真环境下编程方法
3.1 利用TDDL接口编写应用程序
TDDL层位于驱动程序层之上,核心服务层之下。TDDL不涉及任何硬件相关的信息,使用TDDL开发可信计算应用不需要关心设备文件名等。但是TDDL不能构建TPM命令数据流,需要开发者自行构建。有关TPM命令字节流的定义、格式、参数、功能在TCG规范[6]中有详细的介绍。
Tddli_Open()Tddli_Close()两个函数用来打开和关闭TPM设备,这两个函数不需要任何参数。
Tddli_GetStatus()Tddli_GetCapability()分别用来获取驱动程序的状态和TPM芯片的各种属性。
Tddli_TransmitData()是最重要也是最常用的一个函数,它的原型如下:
pTransmitBuf指向已经构建好的TPM命令字节流的缓冲区,TPM收到有效的命令并执行后,将执行结果存储在puntReceiveBufLen指向的缓冲区。
3.2 利用TSPI对象接口模型编写应用程序
利用TSPI对象接口模型是可信计算编程的最常用方法,文献[6]对TSPI对象及其调用关系有的详细的定义。在这里以tpm-tools提供的示例程序tpm_takeownership.c为例简述TSPI接口的使用方法。tpm_takeownership程序首先从终端提示用户输入所有者密码和SRK密码。然后建立TPM所有者信息。所有者建立是TPM的重要操作,只有建立合法的所有者后,TPM的全部功能才能使用。该示例程序的流程图如下:
TSPI接口的每一个对象都依赖上下文对象创建,因为上下文对象提供了连接核心服务层(tcsd)的功能。TSPI中,密码、口令等授权信息被称为秘密(secret),秘密通常保存在策略对象中。tpm_takeownership程序首先获取TPM对象和SRK对象以及他们各自的策略对象,并为这些策略对象设置秘密。所有准备工作完成后,最后调用一次Tspi_TPM_TakeOwnership()函数即可完成所有者创建。
图4 tpm_takeownership程序工作流程图Fig.4 Tpm_takeownership program flowchart
4 实验和测试
4.1 TPM仿真环境测试
TPM仿真实验环境涉及软件很多,需要依赖数学库,编译不成功往往是缺乏库文件导致的。需要注意的是,tpmd和tcsd默认以守护进程的方式运行,不利于查看调试信息和发现问题,在调试阶段需要加入-f选项,并打开多个终端使它们在前台运行。
本文实验采用的各软件包的版本如下:
本方案在Fedora10和Ubuntu 11.10环境下编译、测试通过。从图5可以看到,tpmd进程正常启动,等待来自socket接口的命令。图6的tcsd正常连接到tpmd后,显示TCSD up and runing.此时可信计算服务已经完全运行。图7所示的应用程序tpmmanager借助tcsd服务访问TPM,并显示 TPM的状态和当前PCR寄存器的数值。
图5 tpmd进程前台正常启动Fig.5 Tpmd process starting normally at forground
图6 tcsd进程前台正常启动Fig.6 Tcsd process starting normally at forground
图7 Tpmmanager运行截图Fig.7 Screenshot of tpmmanager
4.2 运算性能对比测试
性能测试目的在于比较软件TPM和硬件TPM的运算性能差别。测试平台的硬件选用Atmel公司的AT97SC3204T芯片评估板,测试项目为200kB长度的代码进行SHA-1算法度量、20字节数据密封和解封操作。表1为两种平台下的测试结果。
需要说明的是,测试结果不仅仅与TPM本身有关,还受主控CPU的运算速度、操作系统、用户输入密码时间等多方面影响,不能完全反映软件TPM与硬件TPM的性能差别。总体来看,软件TPM由于运行在PC机上,性能比硬件TPM高很多,因此使用软件TPM做可信计算研究能够节省很多测试时间。
表1 软件TPM和硬件TPM运算性能对比测试Tab.1 Hardware and software TPM performance comparison
5 结束语
本文主要阐述了可信计算仿真平台各个工具和软件包的依赖关系、编译安装步骤、使用方法,并结合实例分析了TSPI接口对象模型编程的一般方法。最后给出了在Ubuntu 11.10操作系统下的TSPI运行截图和性能对比测试,证明TPM软件仿真环境的可行性和便利性。该仿真实验平台能实现TPM的大部分功能,帮助可信计算的研究者摆脱复杂的硬件设计细节,从而为安全协议、证明策略的研究带来便利。
此外,TPM_emulator的功能不仅仅局限于仿真,tpm_dev驱动模块和TDDL稍加修改后就可以应用到真实TPM的驱动程序。例如,将TPM_emulator的Tddli_Open()Tddli_TransmitData()等函数加入TPM生产厂家提供的驱动程序调用后就可以作为物理TPM的访问接口,将TSS作适当裁剪并交叉编译并后就可以应用到嵌入式平台上。
[1]池亚平,王全民.基于USBkey的可信平台模块的研究与仿真设计[J].北京电子科技学院学报,2007,15(4):13-15.
[2]池亚平.可信计算技术研究与仿真[D].北京:北京工业大学,2007.
[3]MARIO STRASSER.TPM Emulator Design Overview[EB/OL].2011-12-20.http://tpm-emulator.berlios.de/index.html.
[4]CHALLENER D.A Practical Guide To Trusted Computing[M].赵波,严飞,于发江,等,译.北京:机械工业出版社,2009.
[5]张焕国,赵波.可信计算[M].武昌:武汉大学出版社,2011.
[6]TRUSTED COMPUING GROUP.TPM specification version 1.2.Part 3 Commands[EB/OL].2011-03-01.http://www.trustedcomputinggroup.org/resources/tpm_main_specification.