TPM的全称是Trust Platform Module,可信平台模块。
当我们谈到TPM的时候,我们通常指的是实现了TPM标准的芯片,这类芯片可以是物理实体的(discrete TPM,简称dTPM),也可以是其它芯片模拟的(比如Intel的TXE技术中包含模拟的TPM,称为fTPM)。
重点实际上在于实现了TPM标准。
TPM标准是一个叫做Trusted Computing Group(TCG)的组织制定的,目前(2019年)最新的版本是TPM2.0。该标准的目的是“从跨平台和操作环境的硬件和软件两方面,制定可信赖电脑相关标准和规范”。
关于TCG,可以参考https://trustedcomputinggroup.org/。
TPM提供了一系列的接口,软件可以操作这些接口,来完成某些目的,这些目的通常跟安全有关,比如TPM可以用于:
等等。
这些功能的实现需要软硬件的支持,软件的支持当然是指软件要实现什么功能(需要注意上述的功能大多由软件完成,TPM只做支持),硬件的支持主要就是TPM芯片提供的那些接口,在《TPM-Rev-2.0-Part-3-Commands-01.38.pdf》中有列出完整的TPM2.0支持的接口。
比如说下图来自《TPM-Rev-2.0-Part-3-Commands-01.38.pdf》:
这里就提到了加解密,计算HASH,生成随机数等等接口。
如何确定自己的电脑上是否有TPM芯片?
首先可以在BIOS下查看,如下是某电脑(X1C)BIOS下Setup里面的TPM设置:
BIOS下可以开关TPM设备。
进入系统之后也可以查看设备是否存在或者使能:
Windows下可以直接通过PowerShell对TPM进行简单的操作:
具体支持的指令可以在https://docs.microsoft.com/zh-cn/powershell/module/trustedplatformmodule/?view=win10-ps找到(这里的图并不是在同一个平台上截取的,所以可能显示有差异)。
除了Windows,在Linux系统下也可以查看TPM,并通过tss2工具来操作TPM:
以x86平台为例,实际的物理TPM芯片是挂在SPI或者LPC下面的。
通常平台会通过一个固定的地址来访问TPM,具体的地址是什么,可以参考手册。
如果已经在Windows下面,那也可以直接查看:
直接通过MMIO来访问这个地址,如果读到的值是全F,则表示不存在该设备,否则就是存在。
关于这个地址,在UEFI的代码中也有定义:
## This PCD indicates TPM base address.
# @Prompt TPM device address.
gEfiSecurityPkgTokenSpaceGuid.PcdTpmBaseAddress|0xFED40000|UINT64|0x00010012
具体的判断TPM是否存在的代码如下:
/**
Check whether TPM PTP register exist.
@param[in] Reg Pointer to PTP register.
@retval TRUE TPM PTP exists.
@retval FALSE TPM PTP is not found.
**/
BOOLEAN
Tpm2IsPtpPresence (
IN VOID *Reg
)
{
UINT8 RegRead;
RegRead = MmioRead8 ((UINTN)Reg);
if (RegRead == 0xFF) {
//
// No TPM chip
//
return FALSE;
}
return TRUE;
}
有了具体的地址,就可以跟TPM交互了,下面简单介绍与TPM交互的方式。
待续未完......
https://docs.microsoft.com/en-us/windows/security/information-protection/tpm/tpm-recommendations
http://courses.cs.vt.edu/cs5204/fall10-kafura-BB/Papers/TPM/Intro-TPM-slides-2.pdf
https://trustedcomputinggroup.org/resource/tpm-library-specification/
https://docs.microsoft.com/zh-cn/windows/security/information-protection/tpm/trusted-platform-module-top-node