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