实验步骤实验所用安装包如下:
- 启动环境
- 检查环境是否配置成功
创建SRK:tpm2_createprimary -C o -g sha256 -G rsa -c primary.ctxt -p test1_pswd
在主系统上创建可复制的DSK
- 使用tpm2_policycommand-code命令创建策略,策略选择是TPM2_CC_Duplicate
根据报错内容创建一个策略会话:tpm2_startauthsession -S session.dat
然后创建策略
tpm2_policycommandcode -S session.dat -L policy.dat TPM2_CC_Duplicate
接着根据报错内容执行 sudo apt install tpm2-tools
- 接着上一步命令:tpm2_policyauthvalue -S session.dat -L policy.dat
- 更新会话tpm2_flushcontext session.dat
5.创建DSK密钥
- tpm2_create -C primary.ctxt -P test1_pswd -g sha256 -G rsa -r key.prv -u key.pub -c key.ctxt -p dsk_pswd -L policy.dat
- 加载新的SRK,DSK将被复制到该新SRK下
tpm2_createprimary -C o -g sha256 -G ecc -c new_parent.ctxt
6.
- 创建一个策略会话
tpm2_startauthsession --policy-session -S Policy_session.ctx
tpm2_policycommandcode -S Policy_session.ctx -L new_policy.dat TPM2_CC_Duplicate
然后更新会话
tpm2_flushcontext Policy_session.ctx
- 创建 HMAC会话,使用DSK口令
tpm2_startauthsession --hmac-session -L Hmac_session.ctx -c key.ctxt
(根据报错内容可得知:tools4.0没有这个选项)
- 执行TPM2_DUplictae命令
tpm2_duplicate -G null -C new_parent.ctxt -c key.ctxt -r duprv.bin -s seed.dat
- 根据报错内容 ,将所有者密码、认可密码和锁定密码为空值
tpm2_clear lockoutpasswd
- 清除平台层次结构上的授权值
tpm2_clear -c p
- 将所有密码设置为空值
(由④⑤⑥可知:tpm2_clear被自带保护机制上锁,暂时没有找到解锁方法)
7.创建一个ECC主键对象
tpm2_createprimary -C o -g sha256 -G ecc -c context.out
8.tpm2_load
描述:将对象的私有和公有部分都加载到TPM中,该工具以YAML字典格式输出已加载对象的名称,并带有键名称,其中该键的值是十六进制格式的对象名称,例如:name:000bac25cb8743111c8e1f52f2ee7279d05d3902a18dd1af694db5d1afa7adf1c8b3
它还会保存一个上下文文件,以备将来与该对象进行交互。
- 为了创建一个对象,我们必须首先创建一个主键作为它的父键。
tpm2_createprimary -c primary.ctx
- 创建对象:这将使用所有默认值创建一个对象,并将TPM密封的私有和公有部分存储到分别通过-u和-r指定的路径。该工具默认为RSA密钥。tpm2_create -C primary.ctx -u obj.pub -r obj.priv
- 创建对象:在关键对象之外,TPM允许将少量用户指定的数据密封到TPM:
echo "my sealed data" > seal.dat
tpm2_create -C primary.ctx -i seal.dat -u obj.pub -r obj.priv
- 创建EC密钥对象并将其加载到TPM通常,在创建对象时,仅返回对象的公有和私有部分,调用者需要使用tpm2_load将那些公共和私有部分加载到TPM之前,使用对象。但是,这也可以在此命令中完成。
tpm2_create -C primary.ctx -G ecc -u obj.pub -r obj.priv -c ecc.ctx
9.tpm2_rsaencrypt
描述:根据IETF RFC 347,使用指示的填充方案对文件数据的内容执行RSA加密。
- 创建一个RSA密钥并加载它
tpm2_createprimary -c primary.ctx
tpm2_create -C primary.ctx -Grsa2048 -u key.pub -r key.priv
tpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx
- 利用RSA加密
tpm2_rsadecrypt -c key.ctx -o msg.ptext msg.enc
cat msg.ptext
(此步失败)
10.tpm2_sign
描述:使用指定的对称或非对称签名密钥生成指定消息或消息摘要的签名。
对消息签名时,tpm2_sign实用程序首先计算消息的摘要,类似于tpm2_hash命令。它还分别在TPM2_RH_NULL或TPM2_RH_OWNER层次结构下为非受限或受限签名密钥生成验证凭单。
虽然在此工具中提供了对消息进行签名的建议,但建议首先使用tpm2_hash工具并传递摘要和验证凭单。
注意:如果签名密钥是受限制的签名密钥,则必须通过-t输入提供验证和摘要。票证指示TPM执行了消息的哈希。
- 使用认可等级与TPM签署并验证
执行如下:
tpm2_createprimary -C e -c primary.ctx
tpm2_create -G rsa -u rsa.pub -r rsa.priv -C primary.ctx
tpm2_load -C primary.ctx -u rsa.pub -r rsa.priv -c rsa.ctx
echo "my message" > message.dat
tpm2_sign -c rsa.ctx -g sha256 -o sig.rssa message.dat
tpm2_verifysignature -c rsa.ctx -g sha256 -s sig.rssa -m message.dat
- 使用TPM签名并使用OSSL进行验证
openssl ecparam -name prime256v1 -genkey -noout -out private.ecc.pem
openssl ec -in private.ecc.pem -out public.ecc.pem -pubout
# Generate a hash to sign
echo "data to sign" > data.in.raw
sha256sum data.in.raw | awk '{ print "000000 " $1 }' |
xxd -r -c 32 > data.in.digest
# Load the private key for signing
tpm2_loadexternal -Q -G ecc -r private.ecc.pem -c key.ctx
# Sign in the TPM and verify with OSSL
tpm2_sign -Q -c key.ctx -g sha256 -d -f plain -o data.out.signed data.in.digest
openssl dgst -verify public.ecc.pem -keyform pem -sha256
-signature data.out.signed data.in.raw



