Skip to content

Latest commit

 

History

History
126 lines (105 loc) · 7.84 KB

第06章-执行环境.md

File metadata and controls

126 lines (105 loc) · 7.84 KB

执行环境

前面的章节用一些示例代码来表现一些概念。为了能让读者编译和运行这些示例代码,这章将介绍如何构建TPM2.0软件编译和执行环境。一个运行环境包含两部分内容:一个TPM和用于TPM通信的软件栈。你可以使用硬件或者软件实现的TPM来运行这些代码。这一章我们将学习怎样安装微软的TPM2.0模拟器,模拟器也就是一个用软件实现的TPM。当前有两个可以用于TPM2.0应用的API环境:微软的TSS.net和TSS2.0。接下来我们将介绍这两种环境的安装。

搭建TPM环境

所有的TPM2.0编程环境都需要一个TPM来执行代码。对于开发者来说,微软的TPM2.0模拟器时最容易使用的TPM。当然也可以使用其他的TPM2.0设备来运行示例代码,比如硬件TPM,固件TPM等。

微软的模拟器

微软的TPM2.0模拟器用软件实现了一个完整的TPM2.0设备。应用软件可以通过socket接口与TPM模拟器通信。所以TPM模拟器可以与应用软件在同一个系统上,也可以在两个具有网络连接的系统上。

这个模拟器有两个可用的版本。一种是可执行文件,可以通过下面这个链接下载:http://research.microsoft.com/en-US/downloads/35116857- e544-4003-8e7b-584182dc6833/default.aspx。另外一个就是仅仅对TCG会员开放的TPM2.0模拟器源码,开发者可以自己编译,这样对开发者来说是更好的。有源码的主要优势就是就是开发者可以单步调试,这在调试软件错误的时候非常有用。这两种模拟器都只能在windows环境下运行。

我们首先介绍怎么编译模拟器源码和运行编译后的软件。然后,对于非TCG会员来说,我们将介绍怎么获得TSS.net以及模拟器可执行软件并使用它们。最后我们介绍一个简单的python脚本,它可以用来测试模拟器是否在工作。

编译模拟器源码

再次提醒,这一部分内容仅仅对TCG会员有效,因为需要在TCG网站上下载模拟器源码。首先到www.trustedcomputinggroup.org这个网站,点击右上角的会员登陆按钮,然后点击Groups并选择TPMWG,然后选择Documents。这个时候你应该在如下的网址: https://members.trustedcomputinggroup.org/apps/org/workgroup/tpmwg/documents.php。找到最新的模拟器版本,然后下载;文件的名称类似于TPM2.0vX.XX VS Solution。

编译模拟器需要安装VS2012或者更新版本的VS。编译时按照模拟器的release notes文件中的描述来做。

使用模拟器可执行文件

首先在如下网站下载模拟器可执行文件: http://research.microsoft.com/en-US/downloads/35116857-e544-4003-8e7b-584182dc6833/default.aspx。然后选择一个目录解压之。

运行模拟器

首先在install目录下找到模拟器的可执行文件simulator.exe,然后启动它。在安装过程中,你可以设置模拟器监听TPM命令的端口。你也可以在命令行中配置。

模拟器使用两个端口:

  • TPM命令端口:用于收发TPM命令和命令响应。默认的端口是2321;如果你需要更改它,可以按照下面的命令来做:> simulator
  • 平台命令端口:用于类似于电源开关的平台命令。平台命令端口总是比TPM命令的端口大1。比方说,它默认的端口是2322。如果你用命令行改变了TPM命令的监听端口,那么平台端口将被设置成命令行参数值加一。

你需要修改默认端口的原因主要有以下两个:

  • 如果在网络中有其他的应用正在使用这个默认端口。
  • 如果你需要在同一个网络中同时运行两个模拟器,很显然这需要修改默认端口。

测试模拟器

下面让我们来了解一下测试模拟器是否工作的三种方法:一个简单的Python脚本,TSS.net,和SAPI测试代码。

Python脚本

为了测试模拟器是否正确运行,你可以运行如下的Python脚本:

#!/usr/bin/python
import os
import sys
import socket
from socket import socket, AF_INET, SOCK_STREAM
platformSock = socket(AF_INET, SOCK_STREAM)
platformSock.connect(('localhost', 2322))
# Power on the TPM
platformSock.send('\0\0\0\1')
tpmSock = socket(AF_INET, SOCK_STREAM)
tpmSock.connect(('localhost', 2321))
# Send TPM_SEND_COMMAND
tpmSock.send('\x00\x00\x00\x08')
# Send locality
tpmSock.send('\x03')
# Send # of bytes
tpmSock.send('\x00\x00\x00\x0c')
# Send tag
tpmSock.send('\x80\x01')
# Send command size
tpmSock.send('\x00\x00\x00\x0c')
# Send command code: TPMStartup
tpmSock.send('\x00\x00\x01\x44')
# Send TPM SU
tpmSock.send('\x00\x00')
# Receive the size of the response, the response, and 4 bytes of 0's
reply=tpmSock.recv(18)
for c in reply:
print "%#x " % ord(c)
The script sends the TPM startup command to the TPM. If the startup command
works correctly, you should see the following output from the for loop print statement:
>>>for c in reply:
... print "%#x " % ord(c)
...
0x0
0x0
0x0
0xa
0x80
0x1
0x0
0x0
0x0
0xa
0x0
0x0
0x1
0x0
0x0
0x0
0x0
0x0

如果你能得到最后的结果,说明模拟器运行正常。

TSS.net

TSS.net是用于和TPM通信的C#软件库。在https://tpm2lib.codeplex.com这个网站下载软件并安装,按照示例代码的描述操作即可。

SAPI测试代码

按照后面的“TSS2.0”这一节中对SAPI和测试代码的说明操作。如果TPM2.0命令执行成功则说明模拟工作良好。

搭建TPM软件栈

有两种软件栈可以用于和TPM设备通信:TSS2.0和TSS.net。

TSS2.0

TSS是TCG的一个标准,它标识TCG Software Stack。TSS2.0可以在Windows或者Linux平台上编译。它包含5-6层用C实现的软件,其中有两层可以用java实现。可以直接用于开发应用软件的软件层如下:

  • System SPI(SAPI):它是TSS2.0中最底层的软件,它包含了TPM2.0所有的功能。这一层也包含了一些测试代码。你需要全面细致的TPM2.0知识来使用这一层软件。
  • Enhanced System SPI(ESAPI):TSS2.0紧接SPI之上的一层软件。这一层包含了很多附带的代码用于加解密,HMAC和Policy会话,和审计。它同样需要你具备足够多的TPM2.0知识,但是它在使用session上比SPI更容易。
  • Feature API:大多数的软件应该基于这一层开发。它提供的API让你免于详细了解TPM2.0规范繁杂的细节。
  • Feature API Java:这一层就是C版本Feature API到Java代码的转换层,这样一来JAVA应用就可以使用TSS了。

在写作本书的时候,TSS2.0仅仅实现到了SAPI的阶段,同时包含一个内部驱动软件来和TPM模拟器通信。当前这些代码仅仅在GitHub对TCG会员开放。为了访问代码你需要向TCG组委会申请。你可以按照readme.docx文档的说明编译安装并测试它。(现在已经不是了哦,TPM2-software GitHub了解一下)

TSS.net

之前我们也提到了TSS.net,你可以在https://tpm2lib.codeplex.com这个网站上下载并安装它。可以通过《Using the TSS.Net Library.docx》这个文档来详细了解它。遗憾的是,这个文档没有告诉你怎么编译和运行示例代码。Samples\Windows8目录下有一个独立的目录用于存放示例代码项目;你可以参考如下的过程来执行GetRandom这个示例:

  • 打开tss.net\tss.slm。
  • 加载各种各样的项目之后返回OK。
  • 选择Build>Build Solution
  • 启动模拟器。
  • 运行GetRandom这个可执行文件:tss.net\samples\Windows8\GetRandom\bin\Debug\GetRandom.exe -tcp 10(10是随机数的字节数量)。

现在你可以在模拟器上运行其他的示例程序了。勇敢去尝试把!

小节

现在我们已经创建了TPM软件的运行环境,所有我们已经准备好运行本书后续章节中出现的示例代码了。

下一章主要描述了TSS。这个软件现在正处于完善定义和开发中,以后将会对应用开发程序员开放。本书中后续的一些示例代码就是用TSS来实现的。