TPM環境

1.安裝TPM模擬器

下載安裝包:https://developer.berlios.de/project/showfiles.php?group_id=2491
解壓後README文件爲安裝和使用的說明
# tar -xvzf tpm_emulator-X.Y.tar.gz
# cd tpm_emulator-X.Y
# mkdir build
# cd build
# cmake ../
# make
# make install
2.TPM使用
(1)初始化:
#sudo tpmd deactivated
#killall tpmd
#tpmd clear
#rm /var/run/tpm/tpmd_socket:0(出現failed:address alread in use 時執行它)
(2)啓動:
#sudo modprobe tpmd_dev(將該模塊加入內核,如出現Module tpmd_dev not found ,則先運行depmod -a)
#tpmd -f -d clear(加clear清除之前的狀態,防止出錯-----其中-f選項會顯示你發送給tpmd的命令,這樣就可以看到對應函數執行時具體會使用哪個TPM命令
當觀察到Debug:waiting for connections就證明運行成功了。
注:tpmd是用戶空間的deamon實現TPM模擬,通過Socket實現訪問
        tpmd_dev內核模塊提供模擬硬件/dev/tpm,用於後臺的兼容性和前臺命令接收
        tddl是tpm驅動庫,用於提供模塊接口(使用tddl函數接口編程時建議使用參數f,這樣就可以看到對應函數執行時具體會使用哪個tpm命令,便於理解)

3.安裝trousers(TSS軟件棧)
(1)由於使用TPM模擬器,在編譯trousers前需要將其原來的tddl庫改爲TPM模擬器提供的tddl。
注意:不同的發行版,libtddl.so的位置不同,安裝前需要查看自己的libtddl.so位置再修改。
修改 ./src/tcsd/Makefile.am :
tcsd_LDADD=../tcs/libtcs.a ../tddl/libtddl.a –lpthread  
爲:
tcsd_LDADD=../tcs/libtcs.a /usr/lib/libtddl.so –lpthread
修改 ./src/tcsd/Makefile.in :
tcsd_DEPENDENCIES = ../tcs/libtcs.a ../tddl/libtddl.a
爲:
tcsd_DEPENDENCIES = ../tcs/libtcs.a /usr/lib/libtddl.so
(2)檢查trousers是否安裝成功
#sudo modprobe tpm_tis
用lsmod | grep tpm查看是否存在相應的模塊
(3)啓動TCSD
#sudo tcsd start

4.安裝tpm-tools,tpmmanager等
(1)tpmmanager運行命令:
#tpmmanager

附:
TPM emulator測試程序(測試TPM模擬器是否安裝成功)
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define TPM_TAG_RQU_COMMAND 193
#define TPM_TAG_RQU_AUTH1_COMMAND 194
#define TPM_ORD_SHA1Start 160
#define TPM_ORD_SHA1Complete 162
#define TPM_ORD_GetRandom 70



int main(int argc, char **argv)
{
    unsigned int i,j,fd;
    int res,ret;
    unsigned char buf[256];
    
    int buf_size = sizeof(buf);
    unsigned char random_cmd[] = {0, TPM_TAG_RQU_COMMAND,
                 0, 0, 0, 14,
                 0, 0, 0, TPM_ORD_GetRandom,
                0, 0, 0, 8};//70 means TPM_ORD_GetRandom

    unsigned char tpm_sha1start[]={0,TPM_TAG_RQU_COMMAND,
                0,0,0,10,
                0,0,0,TPM_ORD_SHA1Start};
        
    unsigned char tpm_sha1complete[]={0,TPM_TAG_RQU_COMMAND,
                0,0,0,78,0,0,0,TPM_ORD_SHA1Complete,
                0,0,0,64,
                1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
                           33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64};
    

    fd = open("/dev/tpm0",O_RDWR);
    if(fd < 0){
        printf("Error: Open() failed: (%04x)\n ", fd);
        return -1;
    }    

    printf("sizeof(random_cmd): %d\n", sizeof(random_cmd));
    printf("data in random_cmd: ");
       for(i = 0; i < sizeof(random_cmd); i++)
                printf("%02x", random_cmd[i]);
       printf("\n");

    res = write(fd, random_cmd, sizeof(random_cmd));
    
    if(res != sizeof(random_cmd)){
        printf("Error: write random command failed: (%04x)\n ", res);
        close(fd);
        return -1;
    }

    buf_size = 256;
       ret = read(fd, &buf, buf_size);

        printf("ret of read random tpm0: %d\n",ret);
        printf("read tpm0 random data: ");
        for(i = 0; i < ret; i++){
                printf("%02x ",buf[i] );
        }
        printf("\n");
    

    
    buf_size = 256;//buf_size > 10

    printf("sizeof(tpm_sha1start): %d\n", sizeof(tpm_sha1start));
    printf("data in tpm_sha1start: ");
       for(i = 0; i < sizeof(tpm_sha1start); i++)
                printf("%02x", tpm_sha1start[i]);
       printf("\n");
    res =write(fd, tpm_sha1start, sizeof(tpm_sha1start));
    
    if(res != sizeof(tpm_sha1start)){
        printf("Error: write tpm_sha1start failed: (%04x)\n ", res);
        close(fd);
        return -1;
    }
    
    buf_size = 256;
       ret = read(fd, &buf, buf_size);

        printf("ret of read tpm0 after tpm_sha1start : %d\n",ret);
        printf("read tpm0 tpm_sha1start data: ");
        for(i = 0; i < ret; i++){
                printf("%02x ",buf[i] );
        }
        printf("\n");


    buf_size = 256;//buf_size > 10

    printf("sizeof(tpm_sha1complete): %d\n", sizeof(tpm_sha1complete));
    printf("data in tpm_sha1complete: ");
       for(i = 0; i < sizeof(tpm_sha1complete); i++)
                printf("%02x", tpm_sha1complete[i]);
       printf("\n");


    res =write(fd, tpm_sha1complete, sizeof(tpm_sha1complete));
    
    if(res != sizeof(tpm_sha1complete)){
        printf("Error: write tpm_sha1complete failed: (%04x)\n ", res);
        close(fd);
        return -1;
    }
    
    buf_size = 256;
       ret = read(fd, &buf, buf_size);

        printf("ret of read tpm0 after tpm_sha1complete : %d\n",ret);
        printf("read tpm0 data after tpm_sha1complete : ");
        for(i = 0; i < ret; i++){
                printf("%02x ",buf[i] );
        }
        printf("\n");    
    
    close(fd);
    

    return 0;
}
結果:
sizeof(random_cmd): 14
data in random_cmd: 00c10000000e0000004600000008
ret of read random tpm0: 22
read tpm0 random data: 00 c4 00 00 00 16 00 00 00 00 00 00 00 08 20 c2 10 97 bf cb c3 ec
sizeof(tpm_sha1start): 10
data in tpm_sha1start: 00c10000000a000000a0
ret of read tpm0 after tpm_sha1start : 14
read tpm0 tpm_sha1start data: 00 c4 00 00 00 0e 00 00 00 00 00 00 08 00
sizeof(tpm_sha1complete): 78
data in tpm_sha1complete:00c10000004e000000a2000000400102030405060708090a0b0c0d0e0f10111213141516171819
1a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40
ret of read tpm0 after tpm_sha1complete : 30
read tpm0 data after tpm_sha1complete : 00 c4 00 00 00 1e 00 00 00 00 92 cb 89 df 62 d9 00 b3 50 d9 3e 42 25 ca 6f 08 1d 54 7a 28



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章