一种可重构的可信密码模块模拟器实现方法

2022-03-04 06:47孟思琦
武汉大学学报(理学版) 2022年1期
关键词:模拟器数据结构命令

孟思琦,胡 俊†,马 亮

1.北京工业大学 计算机学院,北京 100124;

2.山东可信云信息技术研究院,山东 济南 250098

0 引言

可信计算作为国内外的热门学术研究领域,是信息系统可信运行的安全保障。可信计算以密码学为基础,以可信芯片为可信源头[1],通过可信链条来保障信息系统的可信性。可信芯片分为国家标准规定的可信密码模块(trusted cryptography module,TCM)和国际标准中的可信平台模块(trusted plat⁃form module,TPM)两类。由于可信芯片在成本、灵活性、便携性方面都存在一定弊端,早期国外的一些公司和研究单位曾开发过几款可信密码模块模拟器[2,3]。但这些可信密码模块模拟器一般为模拟特定标准的可信密码模块而设计,其内部功能比较固化。目前可信密码模块有TCM、TCM 2.0、TPM和TPM 2.0等多种不同类型,随着云计算、物联网的发展,特殊场景还对于可信密码模块有特殊的需求。因此,设计一种可以通过重构自身来支持不同类型可信密码模块,或在已有架构基础上进行定制的可信密码模块模拟器,可以更好地适应上述需求,对基于可信密码模块的科研、教学和开发都能提供支持。

本文依托北京工业大学可信计算实验室开发的可信软件基框架Cube,提出了一种新的可信密码模块模拟器设计方法。该方法基于消息驱动模式,将模拟器拆分为可重组、可替换的模块集合,通过软件定义数据结构的方法,提供对模拟器内部数据结构的模版化处理能力,模拟器的内部结构、命令格式均可以软件定义方式实现和修改,使模拟器具备了重构能力。基于该设计方法实现了可信密码模块模拟器的开发及其重构工作。

1 相关工作

基于保护计算机系统、提高系统安全可靠性的理念,可信计算组织(TCG)提出可信平台模块(TPM)的概念,2003年TCG发布了TPM 1.2规范;为了满足各国对密码算法的本地化管理需求,2014年TCG又发布了TPM 2.0规范[4,5]。TPM 2.0标准对结构和命令进行了大幅度改动,增加了包括国密算法在内的多密码算法支持。我国国家密码标准参考TPM标准提出可信密码模块(TCM),并将其作为信息系统密码学意义上的信任源头[6]。TCM标准在主要接口功能方面与TPM相似,只是使用国密算法SM 2、SM 3和SM 4代替了TPM中的RSA、SHA 1和AES等算法。目前,与TPM 2.0标准对应的TCM 2.0标准正在制定中。

随着可信密码模块规范的改进,研究者们在提高硬件TPM灵活性和软件模拟TPM的研究方向也进行了许多改进探索,以达到降低TPM硬件成本并增加其可移植性和互操作性的目的。文献[7]提出了一种支持TPM 2.0规范的基于固件的TPM实现,可利用ARM上的TrustZone进行信任计算。文献[8]为支持TPM的升级,提出一种基于FPGA(field-programmable gate array)的可重构TPM方案,能够为TPM添加新的加密模块,虽然一定程度上能提高平台复用性但重构工作量较大且应用范围仍然存在较大局限。在TPM模拟器开发方面,瑞士苏黎世联邦理工学院(ETH)的Strasser等[2]开发的TPM-Emulator是早期开源TPM模拟器的代表,它实现了硬件TPM的功能模拟,并且提供兼容TPM标准的指令流,但其内部结构固化,不易进行拓展。IBM公司于2010年推出对TPM 1.2提供支持的sw TPM(software TPM),之后2015年版的sw TPM既支持TPM 1.2又支持TPM 2.0[3]。sw TPM中 的TPM proxy机制使其可以在模拟器与真实TPM之间切换。sw TPM虽然具备了一定灵活性,但依赖大量的外部库,导致其缺乏独立性,且sw TPM的内部实现缺少结构化方法,拓展功能需要较大的工作量。微软公司也提供过TPM 2.0的软件模拟器方案,该模拟器可独立编译,有较好的可移植性,但模拟器本身同样没有清晰的模块结构,不利于功能拓展。

2 重构的关键技术

可重构的可信密码模块模拟器必须拥有清晰的模块结构、可软件定义的数据结构和可预设的数据传输机制。我们希望通过模块的增添和重组为模拟器提供不同的功能支持,且可通过修改数据结构和调整相应的模块功能来实现模拟器内部结构和命令格式的改造。

本文设计了一种可重构的可信密码模块模拟器(下文统一简称可重构模拟器)方案,该方案遵循TCM标准,通过功能解耦、数据结构的软件定义和基于消息的数据传输方式三项关键技术构造一个可信密码模块模拟器原型,使其结构和功能均具备灵活性,便于调整架构、数据结构和处理流程,以适应不同场景下的功能拓展需求。

2.1 功能解耦

功能解耦是指本方案从结构入手,将可信密码模块模拟器的内部机制按照功能分工拆解为多个相对独立的模块。将不同类型命令的逻辑实现归属于不同模块,同时命令流程中的接收、分发和响应部分与命令的功能实现部分相互隔离。在命令传输过程中,各部分再根据需求重新组合,形成完整的命令处理流程。功能解耦的实现降低了模拟器结构的复杂性,为模拟器功能修改和拓展提供了方便。

2.2 软件定义数据结构

可信密码模块的内部数据结构和可信命令数据结构都较为复杂,本方案为这些数据结构及其配套的处理方法配备JSON格式的数据结构描述,并根据这些描述提供了通用的数据结构解析模版和处理函数,可以采用相同的规则完成数据结构处理,调整数据结构时相关实现基本不变,可有效简化模拟器的命令处理和改造工作。

2.3 数据传输方法

命令处理过程被解耦到不同模块后需要完成模块的重新组合。本方案采用松耦合的消息驱动机制对模块间的数据传输提供支持,实现传递路径上模块的组合联通。

消息由主记录项和扩展项组成,主记录项为命令处理过程中的命令数据,扩展项则携带命令附加信息。消息的传输路径由系统预先配置,也可以通过配置文件进行定制化修改,称为消息路由。消息路由决定了命令处理过程中各模块的组合方式。配置消息路由可对命令处理流程中的模块组合进行优化调整,是模拟器完成具体重构工作的基础。

3 可重构模拟器设计方案与实现

结合上文所述技术和设计方法,本文基于Cube架构设计实现了可重构模拟器方案和原型系统。Cube是本团队自主研发的一款开源可信软件基框架[9],具备软件定义数据结构和消息驱动的功能,可以满足模拟器基础框架的需要。

3.1 可重构模拟器整体设计

3.1.1 可重构模拟器架构

本方案将模拟器的结构解耦为接口模块、消息预处理模块、功能子模块层和存储模块,其整体架构如图1所示。

图1 可重构模拟器架构Fig.1 The architecture of the reconfigurable emulator

接口模块定义了模拟器与上层用户空间的通信方式,提供相应协议数据流与二进制数据流之间的转换规则。原型模拟器采用Netlink协议对接调用方的内核驱动程序,建立模拟器与调用程序间的数据通道。Netlink套接字是一种面向数据报的通讯方式,允许在内核与用户空间之间双向传递消息,其他接口模式将在4.1节中介绍。

模拟器在接口模块与消息预处理模块之间建立数据流通道,由消息预处理模块负责将接口模块的Netlink数据流转化为承载命令的消息。消息在模拟器内部各功能子模块间传递并在该过程中完成可信命令处理。

功能子模块层中提供若干个可选的功能子模块,它们由模拟器各类功能聚类设计而成,用于实现模拟器中各命令的主体功能,且互相独立存在,不同的功能子模块将接收并处理承载不同命令类型的消息。目前功能子模块层中已经包含了大部分TCM功能,如密钥模块、PCR模块和授权模块等,使用者也可以根据需要添加定制化模块。

存储模块负责将可信密码模块数据写入存储文件,并在模拟器重新启动时读取存储文件以恢复数据。

3.1.2 数据结构定义方法

本方案为模拟器的内部定义数据结构和输入、输出命令提供JSON格式描述,并为所有数据结构分配(类型,子类型)对作为唯一标识。

Cube启动时可以根据JSON描述生成模版,模拟器基于此类模版可以使用相同的规则完成命令结构解析、校验、格式转换等工作。特别是命令结构解析和消息格式转换等处理过程可以调用通用处理函数实现,且其处理逻辑基本一致。这种软件定义数据结构的设计方法实现了数据结构与功能处理工作的隔离,数据的处理过程无需关注其原始数据结构的调整,可有效减少模拟器在重构时的工作量。下面通过授权命令校验的例子进一步说明。

可信密码模块中的授权命令需要在处理过程中计算输入和输出命令的校验值。此计算过程首先需要选择和提取输入、输出命令中的部分元素,然后将它们序列化为二进制数据,最后对其进行HASH或HMAC(Hash-based message authentica⁃tion code)计算。传统模拟器对此的一般做法是为每条命令进行单独的非结构化处理,这种固化的处理方式为模拟器后续的维护和改造带来了负面影响。可重构模拟器提供一种部分元素处理方法,在输入与输出数据结构定义时添加特定的标记位来标记那些有计算需求的元素,使得在命令处理过程中部分序列化函数仅需关注那些标记元素即可。这种做法为不同命令结构提供了通用的校验值计算方法,并且可以支持命令结构与校验对象的动态调整,是软件定义数据结构方法在模拟器的简化和重构工作中的一个典型应用。

3.1.3 命令处理流程

可重构模拟器通过消息驱动的数据传输方法协同各个模块。多个模块的命令处理行为被携带命令的消息按消息路由依次触发,最终形成完整的命令处理流程。图2展示了模拟器中一个命令生命周期的完整处理流程,其过程描述如下:

图2 可重构模拟器命令处理流程Fig.2 The command processing flow of the reconfigurable emulator

1)模拟器与调用方连接,由接口模块接收用户空间发送的调用命令,格式为二进制数据;

2)消息预处理模块依据模版将命令从二进制数据格式转化为消息格式;

3)模拟器根据消息路由将命令消息发往目标功能子模块以实现命令分流;

4)目标功能子模块将消息反序列化为数据结构格式,并调用命令处理函数。若命令无需授权,则直接进行命令处理;若命令需要授权,函数首先进行输入校验,之后进行命令处理,得到处理结果后再进行输出校验;

5)处理结果序列化后以消息格式返回消息预处理模块。若该命令对模拟器内部数据结构有修改,模拟器还复制消息发往存储模块,由存储模块完成存储文件的更新;

6)消息预处理模块将输出消息转化为二进制数据,并通过接口模块返回给调用方。

3.2 可重构模拟器性能测试

可重构模拟器的实验和测试环境为2.20 GHz主频的Intel Xeon E5 CPU;1 GB内存;Centos 7.9操作系统,Linux 3.10内核,其源码已开源[10]。

表1中记录了几种基本可信命令的执行速率,是每条命令循环测试1 000次并取平均值的结果。从表1可以看出,可重构模拟器对于基本可信命令的执行速率均大于6 kb/s,在可接受范围内。经分析,模拟器在执行命令时性能延迟的主要原因来自Cube架构中模块间消息传递和等待的时间。

表1 可重构模拟器部分命令的性能表现Table 1 The performance of some commands of the reconfigurable emulator kb/s

4 模拟器重构示例

可重构模拟器设计的基本理念为通过重构对可信密码模块模拟器进行调整优化。模拟器重构方式主要有以下三种:1)替换部分模块以修改功能;2)添加新模块及相关消息路由以拓展功能;3)修改数据结构,同时添加相应模块和路由,以适应新的应用场景。

下面展示3个已实现的重构示例,旨在说明本方案模拟器是如何通过上述三种重构方式来调整改造原型系统以满足不同应用需求的。

4.1 接口模式切换

如3.1节所述,原型可重构模拟器使用Netlink接口实现与调用方的数据流对接,但这种接口模式依赖于内核驱动程序的支持。针对同一台机器的多个Docker环境下的模拟器应用场景,单内核驱动的结构将导致Netlink协议无法区分多个Docker[11]。此时,可将模拟器内置在Docker中运行,并使用TCP协议实现模拟器直接连接。

得益于模拟器的数据传输方式和模块化解耦,可重构模拟器可通过替换接口模块以具备接口兼容功能,实现对Docker环境的支持。从支持Netlink协议的通用连接模块到TCP连接模块的切换,仅需修改消息路由配置中的消息传递路径和少量模块配置文件即可,且模拟器中模块的替换对下层模块透明,因而可以避免因模块更换而引入新的问题。

4.2 对象监控功能

用户在对可信密码模块模拟器进行学习和调试时,常有查看其内部数据对象和相关运行信息的需求,若能提供一种对象监控功能则可很好地满足这些需求。对此我们在原有模拟器中额外增加了一个对象监控模块,用于监控其运行状态和导出内部数据,其架构如图3所示。

图3 可重构模拟器的监控模式Fig.3 The monitoring mode of the reconfigurable emulator

模拟器的监控逻辑有如下两种:1)控制消息路由配合监控模块,直接复制消息传递路径中的关键消息转发给用户;2)在目标功能模块中添加监控点,由监控点根据内部数据生成监控消息发往监控模块,再由监控模块负责转发或导出数据对象。该示例通过增加对象监控模块和消息路由拓展模拟器的监控功能,可提高模拟器的交互性,对可信密码模块学习和开发调试都有实际价值,是模拟器改造重构理念的有效应用。

4.3 虚拟可信密码模块场景

虚拟化环境中,利用虚拟化技术实现宿主机的可信密码模块,可以为云计算等场景提供基于虚拟可信密码模块的可信保护功能[12~16]。

文献[16]提出了一种虚拟TCM方案,利用虚拟化软件QEMU将宿主机上可信密码模块设备映射到虚拟机中,并在宿主机的vTCM(virtual TCM)驱动程序中为标准TCM命令添加vTCM命令头以支持虚拟机与vTCM的绑定关系。本示例基于该方案将原型模拟器重构,使其提供虚拟化可信密码模块支持。重构后的虚拟化可信密码模块模拟器架构如图4所示。

图4 虚拟化可信密码模块模拟器架构Fig.4 The architecture of the virtualized trusted cryptography module emulator

得益于可重构模拟器的数据结构软件定义方法和模块化结构,本示例在原有模拟器基础上修改消息预处理模块。修改后的消息预处理模块中,消息的vTCM命令头被转换为TCM命令消息中附加的消息扩展项,并与消息一同转发。功能子模块以该消息扩展项作为在虚拟可信根实例模块中选择实例的依据,之后相应实例将使用与单机模拟器类似的流程完成TCM命令的最终处理。

使用QEMU提供的虚拟化功能必须遵循TPM标准,这导致虚拟机启动过程中会产生少部分TPM标准命令,因此在虚拟环境中应用本方案可信密码模块模拟器时存在着两种标准难以兼容的问题。为解决该问题,我们增加一个TPM命令兼容模块完成TPM命令的过滤工作。当收到TPM格式命令时,该模块将对其拦截处理并直接返回结果;当命令为TCM格式时,该模块则按照正常流程转发消息,由功能子模块执行TCM命令的处理过程。

该示例的虚拟化可信密码模块模拟器在Cen⁃tos 8.4下实现,QEMU版本为4.2.0。实验结果显示模拟器能够稳定支撑10台vTCM虚拟机正常使用。

5 结语

可信计算发展趋势下可信密码模块模拟器的相关探索研究日益突出,但主要关注点仍在于功能的使用,对于其本身结构改造的研究较少,且缺乏对兼容性和可持续发展问题的探讨。本文给出一种可重构的可信密码模块模拟器设计方法,可以为模拟器的改造和拓展提供便利。在灵活性、拓展性和交互性方面,可重构模拟器具有传统模拟器无法比拟的优势。本文设计实现了可重构模拟器的架构和关键技术,经过验证,其运行功能良好,可以作为一种通用的基于软件模拟的可信密码模块支撑解决方案。

未来的工作将着重关注以下几个方面:优化模块间的消息传递方式以提高可重构模拟器的运行性能;优化可重构模拟器的依赖库以进一步提高独立性;研究模拟器在其他可信场景和不同处理器架构下的重构应用。

猜你喜欢
模拟器数据结构命令
驾驶模拟器转向系统的设计与研究
管理Windows10的PowerShell命令行使用记录
盲盒模拟器
数据结构线上线下混合教学模式探讨
重典型应用,明结构关系
疫情就是命令 防控就是责任
中国首个自主研发的地球模拟器投入使用
解析Windows10的内部命令
宝箱4
数据结构与算法课程设计教学模式的探讨