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上下文