以下部分内容来自我对tpm2-tools API文档、《A Practical Guide to TPM 2.0》的翻译和理解
关于TPM2基本原理、特性、密钥、层次、PCR等内容,TPM-JS这个项目有较详细的说明:
TPM-JShttps://google.github.io/tpm-js/#pg_welcome想自学以及更深入了解的同学可以参考tpm2-tools doc :Home - tpm2-tools
TPM 的外部编程接口规范: https ://trustedcomputinggroup.org/tpm-library-specification/
TPM2.0实用指南 《A Practical Guide to TPM 2.0》:
https://link.springer.com/content/pdf/10.1007/978-1-4302-6584-9.pdf
对象属性位图字段是TPM2B_PUBLIC. 属性内容:
层次结构可以被认为具有父密钥和子密钥。父密钥保护其子密钥,当子密钥存储在 TPM 之外时提供保密性和完整性。包装其他密钥的密钥也称为存储密钥。存储密钥是受限制的加密密钥。它们不能用于一般解密,这可能会泄露孩子的秘密。
层次结构顶部的最终父级是主密钥。孩子可以是存储钥匙,在这种情况下,他们也可以是父母。孩子也可以是非存储密钥,在这种情况下,它们是叶密钥:孩子但不是父母。
使用TPM2_CC_CreatePrimary
该命令创建主密钥。
使用TPM2_CC_Create
该命令创建非主密钥。该命令将父密钥的句柄和密钥的 TPM2B_PUBLIC 模板作为输入。
TPM2_CC_Create 创建但不将密钥加载到 TPM。该命令返回TPM2B_PRIVATE由父密钥包装(加密)的密钥材料。用于TPM2_CC_Load
将密钥加载到TPM。
使用tpm2_create 创建子对象时,可以通过参数-i,--sealing-input = FILE或STDIN:FILE要密封的数据文件,可选。如果文件是 - ,从标准输入读取。密封数据时,仅允许使用 NULL 方案的TPM_ALG_KEYEDHASH算法。因此,无法指定-G 。
tpm2_unseal (1) - 返回加载的 TPM 对象中的数据 blob。数据 blob 以明文形式返回。使用tpm2_create工具在创建对象时密封数据。这种用于密封数据的对象必须是TPM_ALG_KEYEDHASH类型。
具体TPM命令流程如下:
1. 为了创建一个对象,我们必须首先创建一个主秘钥作为它的父密钥。
tpm2_createprimary -c primary.ctx
2.将数据密封到 TPM
在密钥对象之外,TPM 允许将少量用户指定的数据密封到 TPM。
echo "my sealed data" > seal.dat
tpm2_create -C primary.ctx -i seal.dat -u sealobj.pub -r sealobj.priv -c seal.ctx
3.解封数据
tpm2_unseal -c seal.ctx
tpm2_encryptdecrypt [选项] [参数] - 使用指定的对称密钥对FILE的内容执行对称加密或解密。如果未指定FILE ,则默认为stdin。
注:使用tpm2_encryptdecrypt会报错误:WARN: Using a weak IV, try specifying an IV,需要新建16字节iv文件。
具体TPM命令流程如下:
1.创建 AES 密钥
tpm2_createprimary -c primary.ctx
tpm2_create -C primary.ctx --key-algorithm=aes128 -u key.pub -r key.priv
tpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx
2.加密和解密一些数据
echo "my secret" > secret.dat
echo "secret iv file." >iv.ctx
tpm2_encryptdecrypt -c key.ctx -o secret.enc secret.dat -t iv.ctx
tpm2_encryptdecrypt -d -c key.ctx -o secret.dec secret.enc -t iv.ctx
cat secret.dec
my secret
tpm2_rsaencrypt [选项] [参数]- 使用 TPM 执行 RSA 加密操作,
tpm2_rsadecrypt [选项] [参数]- 使用 TPM 执行 RSA 解密操作。
具体TPM命令流程如下:
1、创建一个 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
2.使用 RSA 加密
echo "my message" > msg.dat
tpm2_rsaencrypt -c key.ctx -o msg.enc msg.dat
3.使用 RSA 解密
tpm2_rsadecrypt -c key.ctx -o msg.ptext msg.enc
cat msg.ptext
my message