Transcript TSS示例程序
TSS示例程序
提纲
TPM模拟环境搭建
TSS编程实例
有关PCR的操作(READ、EXTEND)
HASH操作
文件加解密操作
远程证明
TPM模拟环境的搭建
准备工作:
1. Linux操作系统,内核版本在2.6.30以上
2. Tpm_emulator软件
3. TSS软件栈
以上软件安装完毕后,执行以下3个操作
TPM模拟环境的搭建
(1)启动Tpm_emulator:打开一个新的
终端,在终端中输入命令:
#modprobe tpmd_dev
#rm /var/run/tpm/tpmd_socket:0
#tpmd –fd
TPM_Emulator启动成功
(2)启动TSS软件栈
打开一个新的终端,在终端中输入命令:
#tcsd
//TSS启动
#tpmmanager
则出现如图所示界面:
(3)设置TPM属主及SRK密码
提纲
TPM模拟环境搭建
TSS编程实例
有关PCR的操作(READ、EXTEND)
HASH操作
文件加解密操作
远程证明
(1)有关PCR操作(READ)
示例程序-1
程序功能:
源码参见:
读取TPM中的PCR值
pcr_read.c
程序流程见右图:
创建上下文并 (1)创建上下文并连接到本地
连接到本地 TCS;
TCS
Tspi_Context_Create(&hCont
ext);
Tspi_Context_Connect(hCont
获取TPM对象 ext, 0);
(2)获取TPM对象;
Tspi_Context_GetTpmObject
(hContext,&hTPM);
读取TPM对象 (3)读取TPM对象的PCR值;
的PCR值
Tspi_TPM_PcrRead(hTPM,i,&
pulPcrValueLength,&prgbPcr
Value)
(4)Tspi_Context_FreeMemor
输出PCR值
y(hContext,prgbPcrValue);
(1)有关PCR操作(EXTEND)
示例程序-2(扩
展)
对PCR寄存器
进行扩展操作
源码参见:
(1)创建上下文并连接到本地TCS;
Tspi_Context_Create(&hContext);
Tspi_Context_Connect(hContext,
0);
获取TPM对象
(2)获取TPM对象;
Tspi_Context_GetTpmObject(hCont
ext,&hTPM);
扩展TPM对象
的PCR值
(3)扩展TPM对象的PCR值,通过TCS
扩展到真正TPM的PCR值;
Tspi_TPM_PcrExtend(hTPM, i,
ulPcrDataLength, pbPcrData,
pPcrEvent,&pulPcrValueLength,&pr
gbPcrValue)
(4) 输出扩展PCR值
程序功能:
创建上下文并
连接到本地
TCS
pcr_extend.c
程序流程见右
图:
输出扩展
的PCR值
(2)HASH操作
示例程序-3
对消息进行SHA-1操作
源码参见:
创建HASH对象
程序功能:
创建上下文并
连接到本地
TCS
tpm_hash.c
程序流程见右图:
将消息数据
进行HASH
操作
读取HASH
对象的散列值
输出HASH
操作后的值
(3)文件加解密操作
“存储的安全性”是指计算机中的重要文件必
须以密文的形式存放在磁盘上,以防止私密
信息泄露和客体重用。
密钥的存储保护主要有两种方式
基于加密文件系统的软件保护
系统的加/解密密钥都存放在系统指定的文件中,必须是系统
管理员才有权限访问该文件,并进行密钥的相关操作
密钥本身容易遭受恶意病毒感染或者木马破坏甚至盗取密钥
基于USB Key或身份卡的硬件保护模式
一旦该硬件被盗或者损坏,则密钥就不再安全
(3)文件加解密操作
示例程序-4
程序功能:
源码参见:
对文件加密
tpm_sealdata.c
程序流程如下图:
创建上下文并
连接到本地
TCS
创建加密数据对象
创建RSA密钥对象
创建对称密钥对象
将该RSA公私钥对用SRK
公钥进行加密,并将密文
存放至加密数据对象中
读取待加密文件
加密数据对象生成密文文件
,其中包括:文件密文、
RSA密文和对称密钥密文
将待加密文件用对称密钥加密
生成密文,采用AES-CBC方式
。将密文存放至加密数据对象中
输出密文文件
将对称密钥用生成的RSA
公钥进行加密生成的密文
存放至加密数据对象中( 绑定)
生成的密文结构
用SRK加密RSA对
象生成的密文
用RSA公钥加密
的对称密钥密文
用对称密钥加密
的密文
文件加解密操作
示例程序-5
程序功能:
源码参见:
解密密文文件
tpm_unsealdata.c
程序流程如图:
创建上下文并
连接到本地
TCS
创建RSA密钥对象
创建对称密钥对象
采用AES解密算法,将密文
用对称密钥解密,得到明文
读取密文文件
输出解密后的明文
用SRK私钥解密RSA
公私钥对,得到RSA
公私钥对
用RSA私钥解密对称密钥
得到对称密钥
(4)远程证明
远程证明
可信平台使用AIK对当前存储了平台配置信
息的PCR值进行签名,报告给远程挑战者
以证明其平台状态的可信性
TPM使用EK生成AIK,并通过私有CA签发
的AIK证书来完成身份认证
为什么不能用EK直接作为签名密钥?
(4)远程证明—应用场景
旅馆式办公
用户不需要和特定的机器绑定,而是和服务
器上的身份进行绑定
要求终端机器要是安全的,以防用户的信息
在终端机器上泄露
可以通过TPM来发送当前机器的状态给服
务器,服务器根据用户当前终端的状态来判
断是否允许用户从终端下载其系统镜像
1.Idaik
aik密钥
的标签;
2.Paraik aik密钥参
数;
3.Pkpca
pca的公钥;
4.K
会话密
钥;
5.cred
背书、平
台、一致性证书;
6.Signaik 用aik私钥签
名;
(1)申请AIK证
书
5.encpkpca(K),encK
OWNER
PCA
1.Tspi_TPM_CollateIdentityRequest(
idaik,paraik,pkpca)
4.encpkpca(K),encK
(resp)
1.收集cred:背书证书、平
台证书、一致性证书
2.resp=(pkaik,idaik ,Saik,
cred)
(resp)
TSS
解析TPM命令
2.TPM_CollateIdentityRequest(
paraik,hash(pkpca,idaik))
3.AIK,Saik
TPM
1.验证paraik合法性
2.根据paraik生产AIK密钥对
3.生产签名值Saik =
signaik(hash(pkpca,idaik))
1.pca私钥解密验证cred和Saik
2.签发AIK证书
3.生成对称密钥K
4.resppca=encpkEK(K,hash(pkaik))
1.K
会话密钥;
2.PkEK
EK的公钥;
3.PKaik aik公钥;
4.cred 背包、平台、一
致性证书;
5.certaik aik证书;
6.Saik = signaik
6.resppca,encK
OWNER
(hash(pkpca , idaik))
7.Tspi_TPM_ActiveIdentity(
AIK,resppca,encK(certaik))
10.cert
aik
用K解密
encK(certaik)
TSS
解析TPM命令
8. TPM_ActiveIdentity(
AIK,resppca)
9.K
(2)申请AIK证书
(certaik)
TPM
1.用EK私钥解密resppca
2.验证hash(pkaik)
3.若2成立返回K
PCA
1.random Server挑战的随机
值;2.index Server需要pcr
的索引;
3.pcrindex index对应的pcr值;
4. AIK aik密钥对象;
5.certaik aik证书;
6.Signaik 用aik私钥签名;
(3)验证pcr签名
1.向PCA请求验证certaik合法性
2.若1成立,验证签名值Saik正确
性
3.根据pcr值判断终端的状态,
来确定是否提供服务
16.pcrindex,random,certaik,
OWNER
Saik
Server
11.random , index
12.Tspi_TPM_Quote (
AIK,pcrindex,random)
15.certaik,random,Sa
ik
TSS
解析TPM命令
13. TPM_Quote(
AIK,pcrindex,random)
14.random,Sai
k
TPM
Saik =
signaik(pcrindex,random)
验
证
结
果
17.ce
rtaik验
证请求
PCA
(4)远程证明流程
可信平台所有者生成AIK密钥和证书签发请求
可信平台所有者向隐私CA发送证书签发请求
私有CA签发AIK证书
私有CA将签名的AIK证书返回给可信平台所有者
可信平台所有者激活AIK证书
可信平台所有者保存AIK及其证书
可信平台向挑战者发送验证平台状态数据
挑战者验证平台状态请求
可信平台接收挑战者反馈数据,并进行相应的操作
8.1 远程证明
远程证明
可信平台使用AIK对当前存储了平台配置信
息的PCR值进行签名,报告给远程挑战者
以证明其平台状态的可信性
TPM使用EK生成AIK,并通过隐私CA签发
的AIK证书来完成身份认证
身份平台创建AIK证书处理流程
开始
获取私有CA密钥长度
创建TSS上下文
创建TSS密钥对象
激活AIK证书
连接TSS上下文
获取CA密钥的模数
保存AIK证书
获取TPM对象
设置TSS密钥的公钥
发送验证平台状态请
求
加载根密钥
设置密钥的算法类型
等待接收验证结果
等待
获取AIK证书
等
待
获取SRK策略对象
设置密钥的素数个数
设置SRK口令
设置密钥的加密机制
否
验证通过
是
处理操作
创建AIK对象
产生证书签发请求包
释放TSS上下文资源
获取私有CA密钥
发送证书签发请求包
关闭TSS上下文
生成AIK密钥和证书签发请求
Tspi_Context_Create创建一个新的TSS上下文对象
Tspi_Context_Connect函数来连接到刚创建的TSS上下文
Tspi_Context_GetTpmObject函数来获取TPM对象
Tspi_Context_LoadKeyByUUID函数来加载根密钥以获得授权
Tspi_GetPolicyObject函数来获取SRK的策略对象
Tspi_Policy_SetSecret函数来设置SRK的口令
Tspi_Context_CreateObject函数创建AIK对象
生成AIK密钥和身份证书
调用OpenSSL库来获取隐私CA的密钥
将该OpenSSL的CA密钥转换成TSS密钥对象
get_tss_key_size函数来获取RSA密钥的比特
长度
Tspi_Context_CreateObject函数来创建一个
TSS密钥对象
获取OpenSSL的CA密钥的公用模数
Tspi_SetAttribData函数来初始化隐私CA密钥
对象
设置公钥数据,密钥算法,密钥的素数个数和
密钥的加密机制
生成AIK密钥和身份证书
Tspi_TPM_CollateIdentityReq
uest函数来创建一个新的AIK密
钥及证书签名请求包
含有AIK的公钥,还有可信平台的
签注证书、平台证书和验证证书
生成随机数作为会话密钥,对证书
请求数据采用3DES(本例中采用
该加密算法)进行加密
会话密钥则采用CA的公钥加密以
保证其机密性
发送证书签发请求
根据之前产生的证书,可信平台向私有
CA发送证书签发请求,请求私有CA签
发AIK证书
私有CA签发AIK证书
开始
用3DES方法解密
取出会话密钥
等待接收请求包
取出证书请求
等待
3DES
判断加密类型
接收到请求包
将请求包转化为
TCPA_IDENTITY_REQ
数据结构
解密经过非对称加密
的数据块
未
知
类
型
DES
验证身份证书
AES
签发AIK证书
用AES方法解密
发送AIK证书
用DES方法解密
结束
私有CA签发AIK证书
UnloadBlob_IDENTITY_REQ函数将收到的证书
签发请求包转换成TCPA_IDENTITY_REQ数据块
用私有CA的私钥对证书请求进行解密
UnloadBlob_SYMMETRIC_
KEY函数从解密后的证书请
求中取出会话密钥
根据会话密钥的算法类型,
对证书请求进行解密
UnloadBlob_IDENTITY_PR
OOF函数取出证书请求
私有CA签发AIK证书
TPM产生身份验证证书的过程是将身份标签信息和私
有CA的公钥进行连接,然后采用SHA-1进行散列,再
用AIK的私钥进行签名。即Sign_AIK(SHA1(aikLabel
|| TCPA_PUBKEY(CAPubKey)))
开始
散列连接内容
创建散列对象
获取散列值存入
identityDigest
获取私有CA密钥信息
获取TPM版本信息
散列连接内容
验证身份证书签名
错
误
正确
签发AIK证书
连接身份标签信息,
CA密钥算法和私有CA
公钥
连接TPM版本信息,
TPM验证标签,
identityDigest和
AIK公钥
私有CA验证身份证书的流程
结束
私有CA签发AIK证书
Tspi_Context_CreateObject函数来创建一个类型为
SHA-1的散列对象
Tspi_GetAttribData函数来取出私有CA的密钥
UnloadBlob_TSS_KEY函数将其转化为TCPA_KEY结
构的数据
LoadBlob函数加载身份标签信息
LoadBlob_KEY_PARMS函数加载CA密钥的算法参数
LoadBlob_STORE_PUBKEY函数加载CA的公钥
Tspi_Hash_UpdateHashValue函数对变量credBlob存
储空间进行散列
Tspi_Hash_GetHashValue函数获取散列后的散列值并
存储
私有CA签发AIK证书
Tspi_TPM_GetCapability函数来获取TPM的
版本号
LoadBlob函数加载TPM版本信息
LoadBlob_UINT32函数加载TPM验证标签
LoadBlob函数加载散列值
LoadBlob_PUBKEY函数加载AIK公钥
Tspi_Hash_UpdateHashValue函数对变量
credBlob进行散列
Tspi_Hash_VerifySignature函数来验证身份
证书签名
私有CA签发AIK证书
验证身份证书签名通过后,创建经过私有CA签
名的证书
开始
获取EK的公钥
设置会话密钥参数
设置签发证书数据项
获取散列值存入
asymCAContents的
idDigest结构中
连接会话密钥信息和
asymCAContents的
idDigest结构
填充TCPA_SYM_CA_AT
TESTATION结构
获取EK的模数
填充X509证书
获取AIK公钥信息
加密连接内容
连接AIK密钥的算法
参数和公钥信息
连接证书大小,证书
加密信息和证书
设置签发证书数据项
加密连接内容
散列连接内容
结束
私有CA签发AIK证书
Tspi_TPM_GetPubEndorsementKey函数来获取背书
密钥的公钥
设置会话密钥参数
Tspi_TPM_GetRandom函数生成随机数,将其作为会话
密钥
Tspi_GetAttribData函数来获取AIK公钥
UnloadBlob_TSS_KEY函数将AIK公钥信息转换为
TCPA_KEY结构
调用LoadBlob_KEY_PARMS函数加载AIK密钥的算法
参数
LoadBlob_STORE_PUBKEY函数加载AIK的公钥
Tspi_Hash_UpdateHashValue函数对credBlob存储空
间采用SHA-1方式进行散列
私有CA签发AIK证书
Tspi_Hash_GetHashValue函数存入散列值
填充TCPA_SYM_CA_ATTESTATION结构
LoadBlob_UINT32函数加载证书大小信息
LoadBlob_KEY_PARMS函数加载证书加密
算法信息
LoadBlob函数加载证书内容
OpenSSL库函数设置AES加密密钥,然后
使用该密钥加密credBlob存储空间
私有CA签发AIK证书
设置签发证书中对称密钥加密的数据块信息
LoadBlob_SYMMETRIC_KEY函数加载密钥信
息
LoadBlob函数加载散列值
Tspi_GetAttribData函数来获取背书密钥的模
数
Trspi_RSA_Encrypt函数来用背书密钥的公钥
加密credBlob
设置签发证书中非对称密钥加密的数据块信息
接受并激活AIK证书
私有CA将签名的AIK证书返回给可信平
台所有者
可信平台所有者激活AIK证书
Tspi_Key_LoadKey函数来加载身份密钥
进入TPM
Tspi_TPM_ActivateIdentity函数来激活
AIK证书
保存AIK及其证书
Tspi_Context_RegisterKey函数将AIK
密钥注册到永久存储区
可以将AIK证书保存在本地磁盘
向挑战者发送验证平台状态数据
Tspi_Context_CreateObject函数来创建一个
PCR类型对象
Tspi_PcrComposite_SelectPcrIndex函数来
将PCR 15的值放入新创建的PCR
Tspi_TPM_GetRandom函数产生一个随机数
Tspi_TPM_Quote函数来生成平台状态信息
将该状态信息和AIK证书发送给挑战者
挑战者验证平台状态请求
开始
创建散列对象
创建TSS上下文
等待接收验证数据
等待
连接TSS上下文
接收到验证数据
装载根密钥
对验证数据进行散列
获取SRK策略对象
设置SRK口令
否
验证散列值是否与验证
数据中的散列值一致
是
响应后续请求
挑战者处理验证数据流程图
挑战者验证平台状态请求
创建TSS上下文并连接该TSS上下文,装载根密钥并设置
其口令
Tspi_Context_CreateObject函数来创建类型为SHA-1的
散列对象
Tspi_Hash_UpdateHashValue函数对组成员发送过来的
vData结构体中的rgbData进行散列
Tspi_Hash_VerifySignature函数来验证对rgbData进行散
列的散列值是否与vData结构体中的rgbValidationData数
据相同
挑战者发送验证结果数据给可信平台并做相应的操作
等待其他的被挑战者来进行挑战
可信平台接收挑战者反馈数据
在旅馆式办公中,被挑战者通过验证后
可以下载挑战者上的用户自己的系统镜
像
释放相关空间并关闭TSS上下文