TPM远程证明:基本流程

证据收集和Quote

远程证明主要采用Quote命令(也可以采用PCR绑定的key或PCR绑定的数据来进行证明,不是主流)。

Quote是指一组PCR数据及其签名,TPM2_Quote则是对一组PCR寄存器进行签名的TPM命令,该命令为指定的PCR按给定算法和bank输出Quote结果。

Quote输出的结果可以简化为如下表示:

Quote

Nonce

PCRHash

AK签名

验证Quote需要用新一些的tpm2-tools版本,这里基于Fedora31和版本测试。

先定义两个句柄,0x81010009给EK,0x8101000a给AK。

创建EK:

$tpm2_"ekpass"

创建AK并固化:

$tpm2_\-"akpass"loaded-key:name:000b7392c8852e3365298d23f8c1e35e104e43e16efee172e507d1784fc027b19dbd$tpm2_

模拟一个nonce值并执行Quote命令:

$nonce=e225b230a0ff210ac13c4bc58ea01aa5e9bd4cf4$tpm2_quote-c0x8101000a-lsha256:15,16,22-q$nonce\-"akpass"quoted:ff54434780180022000b2c2bf37ebe44f3369b499e14d3b5a948f7dec53ebd81348e22d864fccc8498dc0014e225b230a0ff210ac13c4bc58ea01aa5e9bd4cf03646d60000000700000000012063600000001000b03008041002051cdfd15463a712da38c49e9390d861030e28cf1f19ebe9f5a8b6901a9df64fcsignature:alg:rsassasig:533d898e79721276373a526ef13d63ae5002ca9604504015afdcb9a305cd49a0904edc96008991a68c30487ae4083a94353ab1133d77e958b331db76f76cd4c3d17dcb2d3895ef8328b0bff2cd10d89f8fcdd81fe4a35475993b912871f8da213aae4f69e87d88f186813da71fa43ecc53359b5a583d69de05f9d82dcafa753169302d0fd4f664869f25ddb5d1eb20e31f8c1d4f9aa5f414aae277d8cc261b064fdc247813751bc414464d6adcf2bc65b6e22d8a9ef41bf3a5cafbc62f8ffaea75ca04f2e2a8d35edabb58d8f4b85e3b3da9a18b6f52dc43fe4f4999f13f136291ef8c4144f4e3b160ddc0e18fdae7c34488883d28892ce3b8575f9ac303039apcrs:sha256:15:0x000000000000000000000000000000000000000000000000000000000000000016:0x000000000000000000000000000000000000000000000000000000000000000022:0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFcalcDigest:51cdfd15463a712da38c49e9390d861030e28cf1f19ebe9f5a8b6901a9df64fc$

生成的,及AK的公钥需要发送给验证方。

是选定的PCR的原始数据,quote中已经包含了对这些PCR数据的哈希,因此可选提供,tpm2-tools并没有强制。

用checkquote校验证据

tpm2_checkquote命令,可以对quote输出进行检查:

$tpm2_\-$noncepcrs:sha256:15:0x000000000000000000000000000000000000000000000000000000000000000016:0x000000000000000000000000000000000000000000000000000000000000000022:0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFsig:533d898e79721276373a526ef13d63ae5002ca9604504015afdcb9a305cd49a0904edc96008991a68c30487ae4083a94353ab1133d77e958b331db76f76cd4c3d17dcb2d3895ef8328b0bff2cd10d89f8fcdd81fe4a35475993b912871f8da213aae4f69e87d88f186813da71fa43ecc53359b5a583d69de05f9d82dcafa753169302d0fd4f664869f25ddb5d1eb20e31f8c1d4f9aa5f414aae277d8cc261b064fdc247813751bc414464d6adcf2bc65b6e22d8a9ef41bf3a5cafbc62f8ffaea75ca04f2e2a8d35edabb58d8f4b85e3b3da9a18b6f52dc43fe4f4999f13f136291ef8c4144f4e3b160ddc0e18fdae7c34488883d28892ce3b8575f9ac303039a$

模拟一个错的nonce值会导致校验错误:

$tpm2_\-"ac"pcrs:sha256:15:0x000000000000000000000000000000000000000000000000000000000000000016:0x000000000000000000000000000000000000000000000000000000000000000022:0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFsig:533d898e79721276373a526ef13d63ae5002ca9604504015afdcb9a305cd49a0904edc96008991a68c30487ae4083a94353ab1133d77e958b331db76f76cd4c3d17dcb2d3895ef8328b0bff2cd10d89f8fcdd81fe4a35475993b912871f8da213aae4f69e87d88f186813da71fa43ecc53359b5a583d69de05f9d82dcafa753169302d0fd4f664869f25ddb5d1eb20e31f8c1d4f9aa5f414aae277d8cc261b064fdc247813751bc414464d6adcf2bc65b6e22d8a9ef41bf3a5cafbc62f8ffaea75ca04f2e2a8d35edabb58d8f4b85e3b3da9a18b6f52dc43fe4f4999f13f136291ef8c4144f4e3b160ddc0e18fdae7c34488883d28892ce3b8575f9ac303039aERROR:ErrorvalidatingnoncefromquoteERROR:Verifysignaturefailed!ERROR:Unabletoruntpm2_checkquote$

tpm2_checkquote并不属于规范定义的TPM命令,它只使用了openssl库(RSA_verify),不使用TPM资源。

解析TPMS_ATTEST数据

所有经TPM签名的数据都使用TPMS_ATTEST结构,签名是针对该结构进行的签名(然后封装在TPM2B_ATTEST结构),结构定义如下。

Parameter

Type

Description

magic

TPM_GENERATED

恒为TCG

type

TPMI_ST_ATTEST

结构类型,Quote类型为0x8018

qualifiedSigner

TPM2B_NAME

签名密钥的名称

extraData

TPM2B_DATA

调用者提供的外部信息(规范未指定)

clockInfo

TPMS_CLOCK_INFO

Clock,resetCount,restartCount,Safe

firmwareVersion

UINT64

固件版本号,由TPM厂商定义

[type]attested

TPMU_ATTEST

结构类型对应的数据

前面得到的quote输出如下:

$:"7.e.=00000010:63:/..X00000030:a0ba2dc5b2725bf10ca618c4acd84cf6..-..r[.:000000000642cdd70000000700000000..:012063600000001000:008041002051cdfd15463a712da38c49..:q-..I00000070::01a9df64fcd.$

从中可以很直观地看到magic和type字段。

qualifiedSigner是一个TPM2B_NAME结构,由一个UINT16的size字段和size长度相关的字节数组的name字段组成(分三种情况,0字节表示没有数据,4字节表示是一个句柄,其它值则表示实际长度),保存的是签名密钥的密码学名字(哈希类运算)。测试数据中size为0x22,跟随的UNIT16为0x0b表明是一个sha256算法,随后的32字节数据是sha256的哈希值。

extraData是一个TPM2B_DATA结构,与TPM2B_NAME的定义类似,测试数据中的size是0x14,后面20字节是Quote消息,一般就把nonce值当作quote数据。

clockInfo字段是一个TPMS_CLOCK_INFO结构,包含了时钟相关的信息,64位的clock字段表示TPM上电的时间(毫秒),32位的resetCount和32位的restartCount,1字节的safe字段记录与时钟复位相关的信息。

接下来8个字节的firmwareVersion是固件版本号。

attested字段是与Quote实际相关的数据,对于Quote命令,这个字段的类型是TPMS_QUOTE_INFO,定义如下。

Parameter

Type

Description

pcrSelect

TPML_PCR_SELECTION

摘要算法和PCR范围

pcrDigest

TPM2B_DIGEST

使用签名密钥计算的PCR摘要

TPML_PCR_SELECTION结构的pcrSelect字段从0x59偏移开始,首先是一个32位的count字段,这里的数据是00000001,即结构体数量为1。

接下来是TPML_PCR_SELECTION结构类型的pcrSelections字段,这个结构包含三个部分:

hash(TPMI_ALG_HASH),32位的哈希算法,即000b这两个字节,代表PCR摘要是使用sha256计算的。

sizeofSelect(UINT8),03表明选择了3个PCR。

pcrSelect,字节数组,描述了所选PCR的位图,这里是008041,转成对应的二进制:

bin(0x418000)'0b10000011000000000000000'

TPM2B_DIGEST结构的pcrDigest字段由一个16位的size和字节数组组成,存放AK使用的哈希算法计算的摘要值,因为AK指定的是sha256,所以这里0x20即32字节,接下来的数据正好为32个字节,消费完整个输出。

测试数据的PCR15,16和22没有度量数据,所以默认值是全0或全F。可以计算验证Quote中的PCR摘要值:

importbinascii,hashlibh=()(_hex('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'))_hex(())'51cdfd15463a712da38c49e9390d861030e28cf1f19ebe9f5a8b6901a9df64fc'

与中的字节流一致。

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐