TPM2.0模拟器的使用与分析(保姆级教程)

前言

这篇报告仅上传学习使用,若有校友看见,别照抄哈。

另外,如果发现学校实验要求使用3.x版本的tpm2-tools,那我只能说这安排任务的脑子有点问题,因为3.x版本早就被淘汰了,虽然这篇文章也是用3.x版本就是了。但是如果像我这样,遇到要求使用3.x版本的tpm2-tools来执行4+版本的指令,把我这篇拿去跟老师对峙吧。

我已经尽力使用3.x版本的指令去实现要求的功能了。

1.实验内容及原理

1. 安装TPM模拟器

2. 安装TPM相关的软件(Intel:tpm2-tss、tpm2-abrmd以及tpm2-tools;IBM:ibmtss)

3. TPM的运行使用,包括生成密钥,加密解密,签名验证,会话和策略相关操作,NV索引等;

4. 程序分析

2.实验步骤与分析

1. 安装TPM模拟器

① 安装相关依赖包

包括autoconf‐archive,libcmocka0,libcmocka‐dev,procps,iproute2,build‐essential,git,pkg‐config,gcc,libtool,automake,libssl‐dev,uthash‐dev,autoconf,doxygen,libjson‐c‐dev,libini‐config‐dev,libcurl4‐gnutls‐dev,libgcrypt‐dev,m4,uuid‐dev,libglib2.0-dev等

sudo apt install lcov pandoc autoconf-archive liburiparser-dev libdbus-1-dev libglib2.0-dev dbus-x11 libssl-dev

sudo apt install autoconf automake libtool pkg-config gcc  libcurl4-gnutls-dev libgcrypt20-dev libcmocka-dev uthash-dev

 ②安装TPM2模拟器

创建文件夹 

mkdir ibmtpm && cd ibmtpm

wget https://jaist.dl.sourceforge.net/project/ibmswtpm2/ibmtpm1332.tar.gz

tar zxvf ibmtpm1332.tar.gz

cd src/

 

sudo make

 

 报错:error,幸运的是我遇到过类似的问题。

解决方案:将gcc、g++版本换为低版本,步骤略去。可参考Ubuntu20.04终端安装、切换低版本gcc/g++_为ubuntu2204安装低版本gcc-CSDN博客

 解决后继续

sudo cp tpm_server /usr/local/bin

增加tpm-server.service文件

sudo vim /lib/systemd/system/tpm-server.service

 

添加的tpm-server.service文件如下: 

[Unit]
Description=TPM2.0 Simulator Server Daemon
Before=tpm2-abrmd.service

[Service]
ExecStart=/usr/local/bin/tpm_server 
Restart=always
Environment=PATH=/usr/bin:/usr/local/bin

[Install]
WantedBy=multi-user.target

重新加载服务的配置文件:systemctl daemon-reload

启动tpm服务:systemctl start tpm-server.service

测试TPM配置情况:service tpm-server status

systemctl daemon-reload
systemctl start tpm-server.service
service tpm-server status

 ③安装TSS软件

 (1)添加tss用户

sudo useradd --system --user-group tss

sudo useradd --system --user-group tss
 (2)TSS安装

 wget https://github.com/tpm2-software/tpm2-tss/releases/download/2.1.0/tpm2-tss-2.1.0.tar.gz

wget https://github.com/tpm2-software/tpm2-tss/releases/download/2.1.0/tpm2-tss-2.1.0.tar.gz

tar zxvf tpm2-tss-2.1.0.tar.gz

cd tpm2-tss-2.1.0/

./configure --enable-unit (--enable-integration)助教说可以去掉

cd tpm2-tss-2.1.0/
./configure --enable-unit

sudo make check

sudo make install

sudo ldconfig
 (3)TPM2-abrmd安装
wget https://github.com/tpm2-software/tpm2-abrmd/releases/download/2.0.2/tpm2-abrmd-2.0.2.tar.gz

mv tpm2-abrmd-2.0.2.tar.gz /home/dp/ibmtpm/src/tpm2-tss-2.1.0/
tar zxvf tpm2-abrmd-2.0.2.tar.gz

​​cd tpm2-abrmd-2.0.2/
sudo ldconfig

./configure --with-dbuspolicydir=/etc/dbus-1/system.d --with-udevrulesdir=/usr/lib/udev/rules.d --with-systemdsystemunitdir=/usr/lib/systemd/system

报错 :

解决方案

 export GDBUS_CODEGEN=/usr/bin/gdbus-codegen(虽然觉得很多余,但确实成功了)

export GDBUS_CODEGEN=/usr/bin/gdbus-codegen

sudo make install

添加tpm2_abrmd服务 

sudo cp /usr/local/share/dbus-1/system-services/com.intel.tss2.Tabrmd.service /usr/share/dbus-1/system-services/

重启 DBUS  sudo pkill -HUP dbus-daemon 

sudo pkill -HUP dbus-daemon

修改system tpm2-abrmd.service服务配置

sudo vim /lib/systemd/system/tpm2-abrmd.service

添加

--tcti="libtss2-tcti-mssim.so.0:host=127.0.0.1,port=2321"

重新加载服务的配置文件:

systemctl daemon-reload

启动tpm2_abrmd服务并查看其状态

systemctl start tpm2-abrmd.service

service tpm2-abrmd status

systemctl daemon-reload
systemctl start tpm2-abrmd.service
service tpm2-abrmd status

 (4)tpm2.0-tools安装
cd ../../../

git clone -b 3.X https://github.com/tpm2-software/tpm2-tools.git

cd tpm2-tools
./bootstrap

./configure

报错:没有安装python和pyyaml

解决

检查发现已经有python3.8

安装pyyaml

 ./configure后发现依旧报错

vim打开configure脚本看了看

发现在找名为python的,而我已有的python3.8一般命名为python3,故创建一个从 python 到 python3 的符号链接即可

sudo ln -s /usr/bin/python3 /usr/bin/python

 至此,问题解决,再次运行./configure成功。

继续实验

./tools/tpm2_getrandom 4

报错: 

解决: 

查看文件,发现tpm2_getrandom.c

但是一般要编译后,才能进行./tools/tpm2_getrandom 4的操作

私以为指导书上面代码的顺序可以交换一下(仅个人拙见),又通过查资料,在tpm模拟器与新版tpm2-tss\abrmd\tools安装_tpm2-tools官网-CSDN博客中发现

 

顺序也是先编译后测试的,故先

sudo make -j5

sudo make install

 再 

tpm2_getrandom 4

 注意,若遇到这样的错误

解决方案一:sudo apt-get install tpm-tools,参考可信计算实验:TPM模拟器的安装与环境配置_可信tpm环境-CSDN博客

解决方案二:(个人觉得解决方案一是没有必要的,因为用这条代码解决的话,我们大可以用sudo apt-get install tpm2-tools来安装tpm2-tools,都不用进行源码安装了……)

确保前面的tpm-server.service和tpm2-abrmd.service还在正常运行即可解决

至此,问题全部解决。 

继续实验

打印prc值查看输出是否正常

tpm2_pcrlist

 2.TPM2试用,包括生成密钥,加密解密,签名验证,会话和策略相关操作,NV索引等;

注意!!!!!!

如果实验要求你用3.x版本用如下指令进行实验,就去跟老师反应吧。(这老师绝对不是什么好鸟)

生成主对象 primary.ctx:

$ tpm2_createprimary -c primary.ctx

  1. 生成RSA密钥,加密及验证过程

创建 rsa 密匙文件,-C 指定父对象,-G 指定算法,-u 指定公共部分输出文件,-r 指定秘密部分输出文件

$ tpm2_createprimary -C primary.ctx -Grsa2048 -u key.pub -r key.priv

$ tpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx

echo “my message” > msg.dat

$ tpm2_rsadecrypt -c key.ctx -o msg.ptext msg.enc

$ cat msg.ptext

  1. 用TPM签名,用OpenSSL验证

使用 openssl 生成签名用的密匙

$ openssl ecparam -name prime256v1 -genkey -noout -out private.ecc.open

$ openssl ec -in private.ecc.pem -out public.ecc.pem -pubout

$ echo “”data to sign> data.in.raw

$ sha256sum data.in.raw|awk’{print”000000”$1}’|xxd -r -c 32 > data.in.digest

$ tpm2_loadexternal -Q -G ecc -r private.ecc.pem -c key.ctx

$ tpm2_sign -Q -c key.ctx -g sha256 -d -f plan -o data.out.signed data.in.digest

使用 openssl 验证签名

$ openssl dgst -verify public.ecc.pem -keyfrom pem -sha256 -signature data.out.signed data.in.raw

  1. 加解密数据

以 AES 加解密为例,生成 AES 密匙并加载

$ tpm2-create -C primaey.ctx -Gaes128 -u key.pub -r key.priv

$ echo “my secret” > secret.dat

$ tpm2_encryptdecrypt -c key.ctx -o secret.enc secrec.dat

$ tpm2_encryptdecrypt -d -c key.ctx -o secret.enc secrec.dat

$ cat secret.dec

  1. 会话和策略的相关操作

开启对话

$ tpm2_startauthsession –policv-session -S session.dat

试用策略

$ tpm2_policyauthvalue -S session.dat -L policy.dat

$ tpm2_createprimary -C o -c prim.ctx

加载密匙并对文件与对话内容进行加密

$ tpm2_load -C prim.ctx -u key.pub -r key.priv -n key.name -c key.ctx

$ echo “plaintext” > plain.txt

$ tpm2_encryptdecrypt -c key.ctx -o encrypt.out plain.txt -p testpswd

$ tpm2_encryptdecrypt -c key.ctx -o encrypt.out plain.txt -p session:session.dat+testpswd plain.txt

不使用密码的情况下重复上述加密操作

$ tpm2_encryptdecrypt -c key.ctx -o encrypt.out plain.txt -p session:session.dat plain.txt

清除会话内容

$ tpm2_flushcontext session.dat

  (5)将TPM对象授权限制为特定的TPM命令,只允许特定的命令与TPM对象交互

$ tpm2_createprimary -C o -c prim.ctx

$ tpm2_load -C prim.ctx -u sealkey.pub -r sealkey.priv -n sealkey.name > -c sealkey.ctx

$ tpm2_startauthsession –policy-session -S session.dat

tpm2_policycommandcode -S session.dat -L policy.dat TPM2_CC_Unseal

$ tpm2_unseal -p session:session.dat -c sealkey.ctx

$ echo “Encrypt Me” > plain.txt

$ tpm2_encryptdecrypt plain.txt -o enc.txt -c sealkey.ctx plain.txt

$ tpm2_encryptdecrypt -o enc.txt -c sealkey.ctx plain.txt

$ tpm2_flushcontext session.dat

  (6)更改TPM对象的授权值

$ tpm2_create -Q -g sha256 -G aes -u key.pub -r key.priv -C prim.ctx

$ tpm2_load -C prim.ctx -u key.pub -r key.priv -n key.name -c key.ctx

$ tpm2_changeauth -c key.ctx -C prim.ctx -r key.priv newkeyauth

  (7)NV索引的创建与删除

$ tpm2_nvdefine -Q 1 -C o -s 32 -a “ownerread|policywrite|ownerwrite”

$ echo “please123abc” > nv.test_w

$ tpm2_nvwrite -Q 1 -C o -I nv_test_w

$ tpm2_nvread -C o -s 32 1

$ tpm2_nvundefine 1

为什么呢?

 执行命令tpm2_createprimary -c primary.ctx时

报错:

再执行tpm2_createprimary --help显示可用的参数,发现根本没有!!!

但是,如果老师又要求用3.x版本来完成差不多的效果就继续跟我做吧。 

注意,上面的(4)(5),3.x版本是绝对完成不了的(至少在我看来)

在实验进行前

 先利用takeownership实现对TPM所有权访问认证设置。利用TPM拥有权来实现证明现有身份验证机密的知识来对所有权进行身份验证。其中-o 为作为所有者密码,-e为认可密码,-l为锁定密码。

tpm2_takeownership -o 1 -e 2 -l 3

创建主键对象,以使用创建的对象生成秘钥。利用-K后参数11作为对象密码,其秘钥为RSA秘钥且哈希函数为SHA256。并将对象保存在文件po.ctx。其中-p后为认可密码。 

tpm2_createprimary -H e -K 11 -g 0x000b -G 0x0001 -C po.ctx -P 2

接下来,开始实验!! 

 (1) 生成RSA密钥,加密及验证过程(包括了加解密数据)

在主键背景下,创建一个RSA秘钥,产生公钥和私钥。-p为主键的对象密码,-K为子类密码,这里设置为11。公钥保存在key.pub中,私有秘钥存为key.priv。

tpm2_create -c po.ctx -P 11 -K 111 -g 0x000b -G 0x0001 -u key.pub -r key.priv

利用tp2_load命令使用认证秘钥加载创建的RSA秘钥,生成秘钥加载的对应信息obj.ctx。 

tpm2_load -c po.ctx -P 11 -u key.pub -r key.priv -n key.name -C obj.ctx

 

vim test1.txt 输入自己的内容 

vim test1.txt

 

利用tpm2_rsaencrypt加密函数利用创建的秘钥对文件进行加密,生成加密文件data.encrypt 

tpm2_rsaencrypt -c obj.ctx -o data.encrypt test1.txt

 验证加密

cat data.encrypt

最后利用tpm2_rsadecrypt解密函数对加密的输出进行解密,生成解密后的文件data.decrypt

tpm2_rsadecrypt -c obj.ctx -I data.encrypt -P 111 -o data.decrypt

 查看解密

 (2) 用TPM签名,用OpenSSL验证(跟着教程走,任务失败;另寻方案,成功)

失败部分: (不用照做,看看我惨痛的教训罢)

使用 openssl 生成签名用的密匙

openssl ecparam -name prime256v1 -genkey -noout -out private.ecc.pem

openssl ec -in private.ecc.open -out public.ecc.pem -pubout

echo "data to sign" > data.in.raw 

sha256sum data.in.raw | awk '{print "000000" $1}' | xxd -r -p > data.in.digest

tpm2_loadexternal -Q -G ecc -r private.ecc.pem -c key.ctx

报错

--help查看指令后,发现没有G,无法调用外部的,所以决定另起一个文件夹

还把openssl生成的换成了rsa

tpm2_createprimary -H e -K 11 -g 0x000b -G 0x0001 -C po.ctx -P 2 
tpm2_create -c po.ctx -P 11 -K 111 -g 0x000b -G 0x0001 -u key.pub -r key.priv 
tpm2_load -c po.ctx -P 11 -u key.pub -r key.priv -n key.name -C obj.ctx 
echo "data to sign" > data.in.raw 
openssl genpkey -algorithm RSA -out private.rsa.pem -pkeyopt rsa_keygen_bits:2048 
openssl rsa -in private.rsa.pem -outform PEM -pubout -out public.rsa.pem 
sha256sum data.in.raw | awk '{print "000000" $1}' | xxd -r -p > data.in.digest 
tpm2_sign -c obj.ctx -P 111 -g 0x000b -s data.out.signed -m data.in.digest 
openssl dgst -verify public.rsa.pem -keyform PEM -sha256 -signature data.out.signed data.in.raw

最后结果是fail,不知道为什么……

 后来选择不用openssl验证,参考了【精选】【可信计算】tpm2-tools的命令及使用_tpmtool-CSDN博客

 成功部分:(因为是借鉴的,代码就不贴了,去这个链接看看吧)

成功

相应的更改文件名称,也是验证成功

更改文件内容,则验证失败

 (3) 加解密数据(已在(1)中实现)

 (4) 会话和策略的相关操作(由于版本冲突的问题,任务失败

开启对话

tpm2_startauthsession --policy-session -S session.dat

(这时候已经表明了版本不兼容的问题)

报错:要安装tpm2-tools,猜测是版本太旧了,没有这命令。只能安装了。

解决:

sudo apt install tpm2-tools

tpm2_startauthsession --policy-session -S session.dat

试用策略

tpm2_policyauthvalue -S session.dat -L policy.dat

加载密匙并对文件与对话内容进行加密

tpm2_createprimary -H e -K 11 -g 0x000b -G 0x0001 -C po.ctx -P 2 
tpm2_create -c po.ctx -P 11 -K 111 -g 0x000b -G 0x0001 -u key.pub -r key.priv 
tpm2_load -c po.ctx -P 11 -u key.pub -r key.priv -n key.name -C obj.ctx

echo “plaintext” > plain.txt

tpm2_encryptdecrypt -c obj.ctx -o encrypt.out plain.txt -P 11

发现无论怎么改,都是报这个错。结合刚刚下载的新的tpm2-tools,意识到可能存在版本冲突导致的错误。

果然,两条指令执行的是不同版本的tpm2-tools

我们知道,apt安装,其默认的可执行路径是/usr/bin

两个版本的路径不一样。我尝试了全部使用新版本4.1.1的tpm2-tools来进行实验,即通过指定路径来执行命令。

很可惜,可能是因为配置的原因,无法继续下去(心态有点崩了)

最终,我选择用最基础的加密方式继续

tpm2_rsaencrypt -c obj.ctx -o encrypt.out plain.txt

清除会话内容

tpm2_flushcontext session.dat

发现tpm2_flushcontext session.dat依旧存在版本问题……

(5)将TPM对象授权限制为特定的TPM命令,只允许特定的命令与TPM对象交互(任务失败,同上一个)

观察代码,发现与(3)一样,都需要seccion,又会有版本错误,故无法完成。

 (6)更改TPM对象的授权值

tpm2_createprimary -H e -K 11 -g 0x000b -G 0x0001 -C po.ctx -P 2 
tpm2_create -c po.ctx -P 11 -K 111 -g 0x000b -G 0x0001 -u key.pub -r key.priv 
tpm2_load -c po.ctx -P 11 -u key.pub -r key.priv -n key.name -C obj.ctx 

看tpm2_changeauth版本

可知tpm2_changeauth也不符号版本,查阅资料,找到一个有类似功能的

tpm2_takeownership -o ownerpassnew -e endorsepassnew -l lockpassnew -O ownerpass -E endorsepass -L lockpass

故,执行

tpm2_takeownership -o 2 -e 3 -l 4 -O 1 -E 2-L 3

成功

 (7)NV索引的创建与删除

tpm2_createprimary -H e -K 11 -g 0x000b -G 0x0001 -C po.ctx -P 2 
tpm2_create -c po.ctx -P 11 -K 111 -g 0x000b -G 0x0001 -u key.pub -r key.priv 
tpm2_load -c po.ctx -P 11 -u key.pub -r key.priv -n key.name -C obj.ctx

设定NV存储,比如index从0x1500001开始,大小为32bytes,属性为0x2000A,授权

tpm2_nvdefine -x 0x1500001 -a 0x40000001 -s 32 -t 0x2000A -P 1
echo "dp">nv.data

向NV中写数据,比如:将nv.data中的数据写入index为0x1500001的位置

tpm2_nvwrite -x 0x1500001 -a 0x40000001 nv.data -P 1

从NV中读取数据,比如:从index为0x1500001位置,偏移量为0,读取32bytes,授权

tpm2_nvread -x 0x1500001 -a 0x40000001 -s 32 -o 0 -P 1

释放NV存储,比如释放index为0x1500001的NV存储

tpm2_nvrelease -x 0x1500001 -a 0x40000001 -P 1

成功

3. 程序分析 

1.tpm2_takeownership 

命令用于设置或更改 TPM 的所有者密码、认可密码和锁定密码

tpm2_takeownership -o 1 -e 2 -l 3

-o 参数用于设置或更改所有者密码(Owner Password)。

-e 参数用于设置或更改认可密码(Endorsement Password)

-l 参数用于设置或更改锁定密码(Lockout Password)

 2. tpm2_createprimary 

命令用于创建主键对象

tpm2_createprimary -H e -K 11 -g 0x000b -G 0x0001 -C po.ctx -P 2

-H e: 这个参数指定了 TPM 主键对象将要存放的层级(Hierarchy)。e 通常表示“认可层级”(Endorsement Hierarchy)。

-K 11: 这个参数设置对象密码为“11”。这个密码用于保护对主键对象的访问。

-g 0x000b: 指定哈希算法为 SHA256。0x000b 是 SHA256 的 TPM 算法标识符。

-G 0x0001: 设置密钥算法为 RSA。0x0001 是 TPM 中 RSA 算法的标识符。

-C po.ctx: 指定输出文件的路径,即将创建的主键对象的上下文将保存在 po.ctx 文件中。

-P 2: 设置认可密码为“2”。这是 TPM 认可层级操作所需的密码。

 3. tpm2_create

用于在已经存在的主键对象的背景下创建一个子密钥

tpm2_create -c po.ctx -P 11 -K 111 -g 0x000b -G 0x0001 -u key.pub -r key.priv

-c po.ctx: 使用 po.ctx 文件中保存的主键对象作为父对象。这意味着新创建的子密钥将与这个主键相关联。

-P 11: 设置连接到主键对象时使用的对象密码。在这个例子中,密码是“11”。

-K 111: 为新创建的子密钥设置密码,这里设置为“111”。

-g 0x000b: 指定哈希算法为 SHA256。0x000b 是 SHA256 的 TPM 算法标识符。

-G 0x0001: 设置密钥类型为 RSA。0x0001 是 TPM 中 RSA 密钥的标识符。

-u key.pub: 将生成的公钥保存到 key.pub 文件中。

-r key.priv: 将生成的私钥保存到 key.priv 文件中。

 4. tpm2_load

用于将密钥(或其他对象)加载到 TPM 中,并且需要指定相关的公钥、私钥和其他相关信息

tpm2_load -c po.ctx -P 11 -u key.pub -r key.priv -n key.name -C obj.ctx

-c po.ctx: 这个参数指定了父对象的上下文文件,即之前创建的主键对象。po.ctx 文件包含了主键对象的信息。

-P 11: 设置父对象的密码,用于认证。在此命令中,密码被设为“11”。

-u key.pub: 指定要加载的密钥的公钥部分,即之前创建的 RSA 公钥文件 key.pub

-r key.priv: 指定要加载的密钥的私钥部分,即之前创建的 RSA 私钥文件 key.priv

-n key.name: 这个参数指定一个输出文件,用于保存加载的密钥对象的名称。key.name 文件将包含密钥的名称信息。

-C obj.ctx: 指定输出文件的路径,用于保存加载后的密钥对象的上下文。在此命令中,密钥对象的上下文将被保存到 obj.ctx 文件中。

 5. tpm2_rsaecrypt

命令用于加密一个文件

tpm2_rsaencrypt -c obj.ctx -o data.encrypt test1.txt

-c obj.ctx: 指定包含 RSA 密钥的 TPM 对象上下文文件。obj.ctx 是之前使用 tpm2_load 命令加载密钥后保存的文件,其中包含了密钥的信息。

-o data.encrypt: 指定输出加密文件的名称。在此命令中,加密后的数据将被保存到 data.encrypt 文件中。

test1.txt: 这是要被加密的输入文件。

 6. tpm2_rsadecrypt

命令用于解密一个文件

tpm2_rsadecrypt -c obj.ctx -I data.encrypt -P 111 -o data.decrypt

-c obj.ctx: 指定包含 RSA 密钥的 TPM 对象上下文文件。obj.ctx 是之前使用 tpm2_load 命令加载密钥后保存的文件,其中包含了密钥的信息。

-I data.encrypt: 指定要解密的输入文件。在此例中,data.encrypt 是之前加密的文件。

-P 111: 提供解密所需的密钥密码。在此命令中,密码被设置为“111”,这是您在创建子密钥时设置的密码。

-o data.decrypt: 指定输出解密文件的名称。在此命令中,解密后的数据将被保存到 data.decrypt 文件中。

 7. tpm2_verifysignature 

命令用于验证使用 TPM签名

tpm2_verifysignature -c obj.ctx -g 0x000b -m messagel.dat -s sig.rssa -t tk.sig

-c obj.ctx-c 参数指定了要使用的密钥的上下文文件。obj.ctx 是这个文件的名称,它包含了 TPM 密钥的上下文信息。这个文件通常是在密钥创建或加载到 TPM 时生成的。

-g 0x000b-g 参数指定了哈希算法。0x000b 是 TPM 哈希算法标识符,通常代表 SHA-256。这意味着签名是使用 SHA-256 哈希算法生成的。

-m message.dat-m 参数后面跟着的是要验证签名的原始消息文件。message.dat 就是这个文件,它包含了原始的、未加密的消息数据。

-s sig.rssa-s 参数指定了签名文件,这里的 sig.rssa 是包含签名数据的文件。这个签名是之前使用 TPM 的私钥对消息进行签名生成的。

-t tk.sig-t 参数用于指定一个验证票据的输出文件。tk.sig 是这个文件的名称。票据是验证过程的一部分,它提供了关于签名验证操作的附加信息。

 8. tpm2_verifysignature

命令用于验证数字签名

tpm2_verifysignature -c obj.ctx -g 0x000b -m messagel.dat -s sig.rssa -t tk.sig

-c obj.ctx:指定一个TPM对象的上下文文件,该文件包含了用于签名验证的公钥。

-g 0x000b:指定哈希算法。0x000b 是TPM 2.0算法规范中对应于SHA-256哈希算法的值。

m messagel.dat:指定原始消息的文件名,这个消息是签名过程中的输入。在验证签名时,需要对这个消息进行哈希处理,并与签名中的哈希值进行比对。

-s sig.rssa:指定签名文件的名称。这个文件包含了之前用私钥生成的数字签名。

-t tk.sig:指定一个验证票据(ticket)的输出文件。在TPM中,票据是一种证明某些操作(如签名验证)已经被正确执行的机制。

 9. tpm2_nvdefine

命令定义一个非易失性(NV)存储区域

tpm2_nvdefine -x 0x1500001 -a 0x40000001 -s 32 -t 0x2000A -P 1

-x 0x1500001: 指定了要定义的NV区域的索引。这是一个唯一的标识符,用于在TPM中标识这个特定的存储区域。

-a 0x40000001: 指定了NV区域的授权值。这个参数定义了访问这个存储区域所需的权限。0x40000001 是一种特定的权限设置,通常关联到某种安全策略。

-s 32: 设置了NV区域的大小,这里为32字节。这意味着在这个存储区域中,你可以存储最多32字节的数据。

-t 0x2000A: 指定了NV区域的属性。每个属性都有特定的含义,比如是否可写、是否需要在每次启动时清除等。0x2000A 是一组特定的属性,可能包括读写权限、是否需要授权访问等。

-P 1: 这个参数提供了用于定义NV区域的密码或授权值。

 10. tpm2_nvwrite 

命令用来向一个非易失性(NV)存储区域写入数据

tpm2_nvwrite -x 0x1500001 -a 0x40000001 nv.data -P 1

-x 0x1500001: 指定了要写入数据的NV区域的索引。这个索引是一个唯一标识符,用于在TPM中识别特定的存储区域。在这个例子中,0x1500001 表示之前已经定义的一个特定NV区域。

-a 0x40000001: 指定了NV区域的授权值。这个参数定义了访问这个存储区域所需的权限。0x40000001 是一种特定的权限设置,通常与某种安全策略相关联。

nv.data: 这是要写入NV区域的数据文件。文件名 nv.data 表示一个包含要写入的数据的文件。

-P 1: 提供了用于操作这个NV区域的密码或授权值。

 11. tpm2_nvread 

命令用来从一个非易失性(NV)存储区域读取数据

tpm2_nvread -x 0x1500001 -a 0x40000001 -s 32 -o 0 -P 1

-x 0x1500001: 指定要读取数据的NV区域的索引。这个索引是一个唯一标识符,用于在TPM中识别特定的存储区域。0x1500001 表示一个特定的NV区域,之前可能已经通过类似 tpm2_nvdefine 命令定义。

-a 0x40000001: 指定NV区域的授权值。这个参数定义了执行读取操作所需的权限。0x40000001 代表了特定的权限设置,通常与特定的安全策略相关。

-s 32: 指定要读取的数据大小,这里为32字节。这意味着从指定的NV区域读取最多32字节的数据。

-o 0: 指定读取操作的起始偏移量。这里 0 表示从NV区域的开始位置读取数据。

-P 1: 提供了用于执行读取操作的密码或授权值。

 12. tpm2_nvrelease 

命令用于释放或删除一个非易失性(NV)存储区域

tpm2_nvrelease -x 0x1500001 -a 0x40000001 -P 1

-x 0x1500001: 指定要释放的NV区域的索引。这个索引是一个唯一标识符,用于在TPM中识别特定的存储区域。0x1500001 表示一个特定的NV区域。

-a 0x40000001: 指定NV区域的授权值。这个参数定义了执行释放操作所需的权限。0x40000001 代表了特定的权限设置,通常与特定的安全策略相关。

-P 1: 提供了用于执行释放操作的密码或授权值。在这个例子中,1 可能是一个用于验证访问权限的示例密码。

结语

第一次写博客,写起来好麻烦......

### 解决 TPM 兼容性问题的方法 TPM(Trusted Platform Module)兼容性问题是由于不同厂商生产的 TPM 芯片存在硬件实现上的细微差异所导致的。这种差异可能导致某些 TPM 设备无法正常工作或需要特定的驱动程序支持。以下是几种解决 TPM 兼容性问题的具体方法: #### 1. 使用标准化的 TPM 版本 TPM 的标准已经从最初的 1.1b 发展到了当前更先进的 2.0 版本[^3]。TPM 2.0 提供了更高的灵活性和安全性,同时也改善了一些兼容性问题。通过升TPM 2.0,可以利用其多算法支持功能来减少因算法不一致而导致的兼容性障碍[^4]。 #### 2. 统一驱动程序接口 针对 TPM 厂商之间的硬件差异问题,可以通过采用统一的 TSS(Trusted Software Stack)框架来简化应用程序底层 TPM 硬件之间的交互过程。TSS 是一种开源项目,旨在为开发者提供跨平台、跨供应商的一致 API 接口,从而降低对具体硬件特性的依赖程度[^1]。 #### 3. 利用虚拟技术增强适应能力 现代计算环境中广泛使用虚拟机管理器 (Hypervisor),如 VMware ESXi 和 Microsoft Hyper-V,在一定程度上能够屏蔽物理主机上存在的各种异构资源特性,包括 TPM 模块。这意味着即便实际安装的是某款特殊型号的 TPM 芯片,也可以借助这些工具向客户操作系统呈现一个通用型的标准设备形象[^2]。 #### 4. 定期更新固件及软件堆栈 保持系统中涉及的所有组件——无论是 BIOS/UEFI 设置还是操作系统的可信引导链路部分都处于最新状态非常重要。这样不仅可以修复已知漏洞还能获得更好的互操作体验。例如微软 Windows 平台下的 BitLocker 加密服务就强烈建议启用最新的 TPM 支持选项以享受最佳性能表现以及最全面的安全防护措施。 ```python import tpm2_pytss as tss def initialize_tpm(): with tss.TPM2() as tpm: try: # Example of initializing a connection to the TPM device. tpm.startup(tss.TPMLib.TPM2_SU_CLEAR) print("TPM initialized successfully.") except Exception as e: print(f"Error during TPM initialization: {e}") initialize_tpm() ``` 上述 Python 示例展示了如何使用 `tpm2-pytss` 库初始化连接至本地 TPM 设备的过程。此库基于官方推荐的最佳实践构建而成,并且经过良好测试验证适用于大多数主流 Linux 发行版及其衍生产品之上运行无误。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cndpppppp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值