英语

适用于 Linux 容器的虚拟 TPM 代理驱动程序

作者

本文档介绍了适用于 Linux 容器的虚拟可信平台模块 (vTPM) 代理设备驱动程序。

简介

这项工作的目标是为每个 Linux 容器提供 TPM 功能。这使得程序能够以与它们在物理系统上与 TPM 交互相同的方式在容器中与 TPM 交互。每个容器都有自己唯一的、模拟的、软件 TPM。

设计

为了使模拟软件 TPM 可用于每个容器,容器管理堆栈需要创建设备对,包括客户端 TPM 字符设备 /dev/tpmX (其中 X=0,1,2...) 和“服务器端”文件描述符。前者通过创建具有适当主次编号的字符设备来移动到容器中,而文件描述符传递给 TPM 模拟器。容器内的软件然后可以使用字符设备发送 TPM 命令,模拟器将通过文件描述符接收命令并使用它来发送回响应。

为了支持这一点,虚拟 TPM 代理驱动程序提供了一个设备 /dev/vtpmx,用于使用 ioctl 创建设备对。ioctl 将配置设备的标志作为输入。例如,这些标志指示 TPM 模拟器是否支持 TPM 1.2 或 TPM 2 功能。ioctl 的结果是“服务器端”的文件描述符以及已创建的字符设备的主次编号。除此之外,还会返回 TPM 字符设备的编号。例如,如果创建了 /dev/tpm10,则返回编号 (dev_num) 10。

一旦创建了设备,驱动程序将立即尝试与 TPM 通信。来自驱动程序的所有命令都可以从 ioctl 返回的文件描述符中读取。应该立即响应这些命令。

UAPI

enum vtpm_proxy_flags

代理 TPM 的标志

常量

VTPM_PROXY_FLAG_TPM2

代理 TPM 使用 TPM 2.0 协议

struct vtpm_proxy_new_dev

VTPM_PROXY_IOC_NEW_DEV ioctl 的参数结构

定义:

struct vtpm_proxy_new_dev {
    __u32 flags;
    __u32 tpm_num;
    __u32 fd;
    __u32 major;
    __u32 minor;
};

成员

flags

代理 TPM 的标志

tpm_num

TPM 设备的索引

fd

代理 TPM 使用的文件描述符

major

TPM 设备的主编号

minor

TPM 设备的次编号

long vtpmx_ioc_new_dev(struct file *file, unsigned int ioctl, unsigned long arg)

VTPM_PROXY_IOC_NEW_DEV ioctl 的处理程序

参数

struct file *file

/dev/vtpmx

unsigned int ioctl

ioctl 编号

unsigned long arg

指向 struct vtpmx_proxy_new_dev 的指针

描述

创建一个匿名文件,该文件被充当 TPM 的进程用于与客户端进程通信。该函数还将添加一个新的 TPM 设备,通过该设备将数据代理到此充当进程的 TPM。调用者将获得一个文件描述符,用于与客户端通信,以及 TPM 设备的主次编号。