前言
这篇报告仅上传学习使用,若有校友看见,别照抄哈。
另外,如果发现学校实验要求使用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
- 生成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
- 用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
- 加解密数据
以 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
- 会话和策略的相关操作
开启对话
$ 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 可能是一个用于验证访问权限的示例密码。
结语
第一次写博客,写起来好麻烦......