You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:05:18