Xen vtpm安装随笔

vtpm相关文档
1 xen环境(包括vtpm)的搭建
1 xen的安装

        shell下依次执行:

         # yum install -y zlib-devel.i386 libX11-devel.i386 openssl-devel.i386 curl-devel.i386 ncurses-devel.i386 libxml2-devel.i386 expat-devel.i386 bridge-utils.i386 gmp-devel.i386 cmake.i386 python-devel.i386 dev86.i386 texinfo.i386 xfig.i386 graphviz-devel.i386 docbook-utils.noarchdocbook-utils-pdf.noarch

        # wgethttp://bits.xensource.com/oss-xen/release/3.4.4/xen-3.4.4.tar.gz

        # tar zxvf xen-3.4.4.tar.gz

        # cd xen-3.4.4

        # make && make install
2 dom0的安装

        由于在第一步中已经在/boot文件夹下生成了vmlinux,还需要ramdisk,执行命令:

# depmod 2.6.18.8-xen

         # mkinitrd -v -f --with=aacraid --with=sd_mod --with=scsi_mod initrd-2.6.18.8-xen.img 2.6.18.8-xen

         # cp initrd-2.6.18.8-xen.img /boot

      修改grub(grub0.98)

      title xen-vtpm

linux /boot/xen.gz

      module


3 domu的安装

          由于在centos5.8下虚拟化工具的不熟悉,以及qemu不容易安装到centos5.8下。所以       

           1.Ubuntu的系统中使用qemu安装使用与centos5.8同样的安装光盘安装系统,这时候为了减少空间的使用,可以选择较少的安装软件。

2.       xen的根目录下首先拷贝一份linux-2.6.18.8-hg的源码,

3.       修改Makefile的第四行 EXTRAVERSION=.8.domu

4.       然后使用make menuconfig对其进行配置,在选择的时候,

 [*] Enable Xen compatible kernel  

 

 [ ] Privileged Guest (domain 0) (NEW)

5.       <> Backend driver support           

6.       <M>   XEN TPM Interface

7.       完成后make && make modules_install&& make install


2 vtpm的使用

xend start

modprobetpmd_dev

modprobetpmbk

xm create config

vtpmd -f

vtpm_managerd

其中的config文件如下:

bootloader='/usr/bin/pygrub'

disk = [ 'tap:aio:/root/domu_modified/domu2.img,xvda,w']

vtpm = ['backend=0']

#usb=['1']

vif =['bridge=eth0']

vcpus=4

memory = 256

vfb = ["vnc=1"]

name = "debug-tpm1"

on_crash = 'destroy'

然后执行

xmvncviewer nxm console n进入domu,在domu中就可以使用vtpm了。

tcsd -f

tpm_version

tpm_getpubkey

    ...
3 UkeySenselock)的使用
4 vtpmUkey的结合
1 vtpm前端驱动分析

vtpm的前端驱动存放在drivers/char/文件夹下,文件名是tpm_xenu.c

由于现在只需要输出从前端驱动接收到的后端驱动发来的信息,对其具体的分析是没有必要的。经测试,处理后端驱动发送过来信息的函数是tpmif_rx_action,信息存放在变量txb->data中。因此添加以下代码到以上函数:

              /******************************  ***********************/

 

              int i = 0;

 

              printk("tpmif_rx_action %d bytes:\n",tocopy);

 

              for (i=0;i <tocopy; i++)

 

              {

 

                     printk("%03x ",txb->data[i]);

 

              }

 

              printk("\n");

 

              /***************************** **************************/

这样之后重新编译前端驱动,并将其安装到系统中。
2 vtpm后端驱动分析

待完成
3修改vtpm实例处理tpm命令的代码(改为使用Ukey),以tpm_getpubkey为例

经过调试确定对tpm命令的处理是在文件tpm_cmd_handler.c中完成的,所以修改tpm_getpubkey的处理函数TPM_RESULT execute_TPM_ReadPubek,在其中添加调用Ukey的代码,并修改其返回值。

/********************* modified by gcy3y begin*********************/

 

#ifdef debug_gcy3y

 

#include "readUKey/readUKey.c"

 

       int i_gcy3y = 0;

 

       char s[20] = {0};

 

       i_gcy3y = readUKey(s);

 

       if( i_gcy3y != 0)

 

       {

 

              printf(" call USBkey function  error !\n");

 

       }else{

 

              memcpy((char *)&checksum, s, 20);

 

       }     

 

#endif

 

这样之后重新编译程序并安装到系统中。下次使用的时候就可一查看到结果。

/********************* modified by gcy3y end **********************/
4 查看结果

在没有使用Ukey的时候,在domu中调用命令tpm_getpubkeyvptm_manager的输出日志为:

 

TPMD[9]: tpm/tpm_cmd_handler.c:4182: Debug: tpm_handle_command()

 

TPMD[9]: tpm/tpm_cmd_handler.c:3493: Debug: [TPM_TAG_RQU_COMMAND]

 

TPMD[9]: tpm/tpm_cmd_handler.c:3829: Debug: [TPM_ORD_ReadPubek]

 

TPMD[9]: tpm/tpm_credentials.c:149: Info: TPM_ReadPubek()

 

EliteIV not found!

 

 call USBkey function  error !

 

TPMD[9]: tpm/tpm_cmd_handler.c:4137: Info: TPM command succeeded

 

TPMD[9]: tpmd.c:227: Debug: Sent[318]: 0 0 0 9 0 c4 0 0 1 3a 0 0 0 0 0 0 0 1 0 3 0 1 0 0 0 c 0 0 8 0 0 0 0 2 0 0 0 0 0 0 1 0 a9 83 1c 2c 18 fa 74 72 c0 13 a1 97 f2 41 ed 5b c7 ae 9 24 34 63 2 5c 2 f c3 b4 a3 bf 4f 3a 1b 98 54 84 37 72 2c 40 b3 45 a3 2f 5d 86 aebd 7c f0 d9 50 30 b 57 49 41 cd 13 32 89 cc 3e 92 a5 c8 44 ec c0 a5 3e e8 a0 ac 1 26 ca 91 0 b6 75 91 c 93 67 74 91 55 83 a6 1f 72 cbaf 15 7f 26 8e 3 d3 ed c0 9e ab e6 8b 89 52 cf 92 cd c4 bf 96 67 5e 3f 8e f1 6a 2d b5 8c 4c 32 72 3c 91 0 9 87 2c 26 90 a7 d6 ef 38 87 2e 61 33 99 19 1a 76 f 77 41 f7 c0 c9 74 f0 d5 1a e5 f5 35 fc db ad f 98 5f 62 68 66 4 31 12 6a e 54 c2 a cd a9 83 e3 6d d4 38 cc f7 72 f6 e8 5c 6 a4 56 dc e5 97 0 53 97 f6 e1 1 97 48 29 15 4c 8e 44 30 1d ce 62 b2 6a 98 5d ed 4 61 cf e 8b ef d2 66 1 78 8c fafb 93 43 dc 2d ec 73 68 95 ad c8 be b1 ed a8 98 0 fa 80 0 b4 4f 13 16 fd d4 c5 d1 3a 23 51 c3 8d 1d 6f 2f bf 4d 56 f8 44 afed e 85 9b f5

在使用Ukey以后,从新在domu中执行tpm_getpubkey命令,vtpm_manager的日志输出为

 

 

 

 

 

 

TPMD[9]: tpm/tpm_cmd_handler.c:4182: Debug: tpm_handle_command()

 

TPMD[9]: tpm/tpm_cmd_handler.c:3493: Debug: [TPM_TAG_RQU_COMMAND]

 

TPMD[9]: tpm/tpm_cmd_handler.c:3829: Debug: [TPM_ORD_ReadPubek]

 

TPMD[9]: tpm/tpm_credentials.c:149: Info: TPM_ReadPubek()

 

Verify DEV_PIN of root directory...

 

Success!

 

Create objective file using S4WriteFile()...

 

File exists!

 

Update objective file ...

 

Success!

 

Read data from objective file ...

 

Success!

 

The data read: 123456789guochunyang

 

end all OK

 

TPMD[9]: tpm/tpm_cmd_handler.c:4137: Info: TPM command succeeded

 

 

 

INFO[VTPM]: [Backend Listener]: Sending DMI's response to guest.

 

INFO[VTPM]: [Backend Listener]: Backend Listener waiting for messages.

 

TPMD[9]: tpmd.c:227: Debug: Sent[318]: 0 0 0 9 0 c4 0 0 1 3a 0 0 0 0 0 0 0 1 0 3 0 1 0 0 0 c 0 0 8 0 0 0 0 2 0 0 0 0 0 0 1 0 a9 83 1c 2c 18 fa 74 72 c0 13 a1 97 f2 41 ed 5b c7 ae 9 24 34 63 2 5c 2 f c3 b4 a3 bf 4f 3a 1b 98 54 84 37 72 2c 40 b3 45 a3 2f 5d 86 aebd 7c f0 d9 50 30 b 57 49 41 cd 13 32 89 cc 3e 92 a5 c8 44 ec c0 a5 3e e8 a0 ac 1 26 ca 91 0 b6 75 91 c 93 67 74 91 55 83 a6 1f 72 cbaf 15 7f 26 8e 3 d3 ed c0 9e ab e6 8b 89 52 cf 92 cd c4 bf 96 67 5e 3f 8e f1 6a 2d b5 8c 4c 32 72 3c 91 0 9 87 2c 26 90 a7 d6 ef 38 87 2e 61 33 99 19 1a 76 f 77 41 f7 c0 c9 74 f0 d5 1a e5 f5 35 fc db ad f 98 5f 62 68 66 4 31 12 6a e 54 c2 a cd a9 83 e3 6d d4 38 cc f7 72 f6 e8 5c 6 a4 56 dc e5 97 0 53 97 f6 e1 1 97 48 29 15 4c 8e 44 30 1d ce 62 b2 6a 98 5d ed 4 61 cf e 8b ef d2 66 1 78 8c fafb 93 43 dc 2d ec 73 68 95 ad c8 be b1 ed a8 98 0 fa 80 0 b4 4f 13 16 fd d4 c5 31 32 33 34 35 36 37 38 39 67 75 6f 63 68 75 6e 79 61 6e 67

 

在domu中的前端驱动的输出信息是:

 

 

tpmif_rx_action 314 bytes:

 

000 0c4 000 000 001 03a 000 000 000 000 000 000 000 001 000 003 000 001 000 000 000 00c 000 000 008 000 000 000 000 002 000 000 000 000 000 000 001 000 0a9 083 01c 02c 018 0fa 074 072 0c0 013 0a1 097 0f2 041 0ed 05b 0c7 0ae 009 024 034 063 002 05c 002 00f 0c3 0b4 0a3 0bf 04f 03a 01b 098 054 084 037 072 02c 040 0b3 045 0a3 02f 05d 086 0ae 0bd 07c 0f0 0d9 050 030 00b 057 049 041 0cd 013 032 089 0cc 03e 092 0a5 0c8 044 0ec 0c0 0a5 03e 0e8 0a0 0ac 001 026 0ca 091 000 0b6 075 091 00c 093 067 074 091 055 083 0a6 01f 072 0cb 0af 015 07f 026 08e 003 0d3 0ed 0c0 09e 0ab 0e6 08b 089 052 0cf 092 0cd 0c4 0bf 096 067 05e 03f 08e 0f1 06a 02d 0b5 08c 04c 032 072 03c 091 000 009 087 02c 026 090 0a7 0d6 0ef 038 087 02e 061 033 099 019 01a 076 00f 077 041 0f7 0c0 0c9 074 0f0 0d5 01a 0e5 0f5 035 0fc 0db 0ad 00f 098 05f 062 068 066 004 031 012 06a 00e 054 0c2 00a 0cd 0a9 083 0e3 06d 0d4 038 0cc 0f7 072 0f6 0e8 05c 006 0a4 056 0dc 0e5 097 000 053 097 0f6 0e1 001 097 048 029 015 04c 08e 044 030 01d 0ce 062 0b2 06a 098 05d 0ed 004 061 0cf 00e 08b 0ef 0d2 066 001 078 08c 0fa 0fb 093 043 0dc 02d 0ec 073 068 095 0ad 0c8 0be 0b1 0ed 0a8 098 000 0fa 080 000 0b4 04f 013 016 0fd 0d4 0c5 031 032 033 034 035 036 037 038 039 067 075 06f 063 068 075 06e 079 061 06e 067

 

这就说明成功的访问了Ukey,并且将读取到的数据传送到了前端驱动。这个时候,tpm_getpubkey命令的执行结果是:

Tspi_TPM_GetPubEndorsementKey failed: 0x00003128 - layer=tsp, code=0128 (296), Unknown

这说明在修改了公钥的hash值之后,没能通过tss的某些有效性验证。如果需要的话,这需要在以后的工作中完成。

相关文章
相关标签/搜索