如何使用tpm2-pytss生成Quote?遇‘不兼容方案’报错求解决
解决tpm2-pytss生成Quote时"unsupported or incompatible scheme"报错问题
问题根源
你当前创建应用密钥时用了默认参数,生成的是存储类密钥(默认类型为TPM2_ALG_RSA,签名scheme为TPM2_ALG_NULL),这类密钥不具备Quote要求的签名能力,因此触发不兼容方案的报错。Quote必须使用具备签名权限的密钥,且签名scheme要和指定的哈希算法(比如sha256)匹配。
修复方案
需要显式指定应用密钥为签名类型,并配置对应的签名scheme。以下是修改后的代码:
import tpm2_pytss from tpm2_pytss.constants import TPM2_ALG_RSA, TPM2_ALG_SHA256, TPM2_ALG_RSASSA from tpm2_pytss.structs import TPM2B_SENSITIVE_CREATE, TPMS_SENSITIVE_CREATE, TPM2B_AUTH, TPM2B_SENSITIVE_DATA from tpm2_pytss.structs import TPM2B_PUBLIC, TPMT_PUBLIC, TPMS_PUBLIC_PARMS, TPMS_RSA_PARMS, TPMT_SYM_DEF_OBJECT from tpm2_pytss.structs import TPMS_SCHEME_RSASSA, TPMS_HASH_SCHEME, TPM2B_DATA ESAPIObject = tpm2_pytss.ESAPI() in_sensitive = TPM2B_SENSITIVE_CREATE( sensitive=TPMS_SENSITIVE_CREATE( userAuth=TPM2B_AUTH(), data=TPM2B_SENSITIVE_DATA() ) ) # 创建SRK(默认父密钥,支持存储子密钥即可) SRK = ESAPIObject.create_primary(in_sensitive) # 定义签名密钥的公钥模板:RSA + RSASSA_SHA256签名方案 public_template = TPM2B_PUBLIC( publicArea=TPMT_PUBLIC( type=TPM2_ALG_RSA, nameAlg=TPM2_ALG_SHA256, # 配置密钥属性:允许签名/加解密、用户授权、敏感数据不外露等 objectAttributes=0x00040072, authPolicy=b"", parameters=TPMS_PUBLIC_PARMS( asymmetric=TPMS_RSA_PARMS( symmetric=TPMT_SYM_DEF_OBJECT( algorithm=TPM2_ALG_RSA, keyBits=TPMU_SYM_KEY_BITS(aes=128), mode=TPMU_SYM_MODE(aes=TPM2_ALG_CFB) ), scheme=TPMS_SCHEME_RSASSA( scheme=TPM2_ALG_RSASSA, details=TPMU_ASYM_SCHEME(rsassa=TPMS_HASH_SCHEME(hashAlg=TPM2_ALG_SHA256)) ), keyBits=2048, exponent=0 ) ), unique=TPMU_PUBLIC_ID(rsa=TPM2B_PUBLIC_KEY_RSA(buffer=b"")) ) ) # 用指定模板创建签名用应用密钥 CreatedAppKey = ESAPIObject.create(SRK[0], in_sensitive, public_template) LoadedAppKey = ESAPIObject.load(SRK[0], CreatedAppKey[0], CreatedAppKey[1]) # 生成Quote,确保哈希算法与密钥scheme匹配 Quote = ESAPIObject.quote(LoadedAppKey, "sha256:0,1,2,3,4,5,6,7", TPM2B_DATA(b""))
关键说明
- 密钥属性:
objectAttributes=0x00040072包含了TPMA_OBJECT_SIGN_ENCRYPT(签名加解密权限)、TPMA_OBJECT_USERWITHAUTH(用户授权)等必要属性,确保密钥可用于签名操作。 - 签名scheme匹配:如果想用ECC密钥,可将
type改为TPM2_ALG_ECC,scheme改为TPM2_ALG_ECDSA,同时调整对应的参数细节。 - TPM兼容性:部分老款TPM可能不支持2048位RSA或某些ECC曲线,可根据实际硬件调整
keyBits或曲线类型。
内容的提问来源于stack exchange,提问作者Nati
相关产品推荐
相关产品推荐

