刘栋,王东辉
(中国科学院大学声学研究所,北京 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 的基础上,提出了一种适用于嵌入式系统的轻量可信软件栈,设计了命令调用机制,实现了简单的密钥管理、授权计算等可信功能,并证明了其能够在常见的微控制器上正常运行相关的可信计算命令。在下一步研究中,将进一步完善该软件系统的相关性能,探索更多的应用场景。