linux tpm 測試完整記錄,親測有效。


沒有tpm芯片,采用模擬器的方式來測試。

實驗環境:內核版本 3.10.0-327

軟件包准備:

內網,沒有倉庫,自己網上下載:

1. cmake-3.9.6-Linux-x86_64.tar.gz

解壓后就已經有bin文件,可以直接使用bin下的cmake,

ls cmake-3.9.6-Linux-x86_64/
bin doc man share

2. 然后下載gmp,我使用的是gmp-6.1.2版本,

./configure && make && make install

在install的時候,它會提醒要求make check

+-------------------------------------------------------------+
| CAUTION:                                                    |
|                                                             |
| If you have not already run "make check", then we strongly  |
| recommend you do so.                                        |
|                                                             |
| GMP has been carefully tested by its authors, but compilers |
| are all too often released with serious bugs.  GMP tends to |
| explore interesting corners in compilers and has hit bugs   |
| on quite a few occasions.                                   |
|                                                             |
+-------------------------------------------------------------+

我也按要求操作一把,沒看到什么區別,但是同事在復制我的過程的時候,還是有些區別,建議大家按照安裝步驟來。

 

3.安裝tpm_emulator

因為並沒有真實的芯片,所以還需要安裝模擬器,如果有真實的芯片支持,則可以跳過安裝模擬器這一步。

下載並解壓之后,老規矩,先看readme,readme中針對不同的操作系統給了不同的步驟。

The compilation and installation of the TPM emulator package is based on
the CMake build environment (version 2.6 or better) and requires that the GNU MP library (version 4.0 or better) is properly installed on your system. A working MinGW compiler suite is further required on Windows (see http://www.mingw.org/). To compile and install the package execute:  # tar -xvzf tpm_emulator-X.Y.tar.gz # cd tpm_emulator-X.Y # mkdir build # cd build # cmake ../ ----------這一步,由於我們第一步沒有安裝cmake,可以用絕對路徑因為bin文件即可。本例中,我使用的是/home/caq/cmake-3.9.6-Linux-x86_64/bin/cmake  -D CMAKE_BUILD_TYPE=Debug ../ # make # make install

 按步驟操作即可。

Usage Examples for TPM/J
--------------------------------------------------------------------------

=== Linux
# modprobe tpmd_dev
# tpmd -f -d

 

4.下一步,下載trousers-master.zip並安裝trousers,這個就是傳說中的tss協議棧 (tcg software stack) 。

解壓后,參照readme文件,一步步操作:

不過,由於我們是使用模擬器操作,所以原本makefile中的lib需要替換成我們模擬器安裝的lib。

先查找一下lib的路徑:

# whereis libtddl.so
libtddl: /usr/local/lib/libtddl.a /usr/local/lib/libtddl.so

然后,修改對應的makefile

修改./src/tcsd/Makefile.am :
tcsd_LDADD=../tcs/libtcs.a ../tddl/libtddl.a –lpthread  
為:
tcsd_LDADD=../tcs/libtcs.a /usr/local/lib/libtddl.so –lpthread
 
修改 ./src/tcsd/Makefile.in :
tcsd_DEPENDENCIES = ../tcs/libtcs.a ../tddl/libtddl.a
為:
tcsd_DEPENDENCIES = ../tcs/libtcs.a /usr/local/lib/libtddl.so
 
然后參照如下操作即可。
  To build trousers after you have the device driver installed:

  $ sh bootstrap.sh
  $ ./configure [--enable-debug] [--enable-gprof] [--enable-gcov]
  $ make
  # make install

這個步驟的README非常重要,包括64位的安裝的不同也會提示。也包括安裝完之后的運行方法和參數,不過-h參數也提供了方法。

另外,由於這個步驟默認的configure是將編譯warning設置成了error,所以make的時候,經常會停止,建議在make之前,

將configure腳本中的CFLAGS 參數修改一下,去掉-Werror -Wno-unused-parameter 。不然會好多編譯不過的。

 

然后運行 tcsd -e -f  可以看到如下進程運行,我為了了解運行機制,gdb了一把,這個就需要在configure的時候對debug使能。

# ps -ef |grep -i tcsd
root 156492 183333 0 16:20 pts/4 00:00:00 grep --color=auto -i tcsd tss 184541 107431 0 Nov15 pts/11 00:00:00 tcsd -e -f

 使能了debug的運行結果,如果沒有使能debug,不方便調試:

tpm_testing.c:221: Debug: tpm_rsa_encrypt(RSA_ES_OAEP_SHA1)
tpm_testing.c:225: Debug: tpm_rsa_decrypt(RSA_ES_OAEP_SHA1)
tpm_testing.c:229: Debug: verify plain text
tpm_testing.c:261: Info: Self-Test succeeded
tpm_startup.c:43: Info: TPM_Startup(2)
tpmd.c:412: Debug: waiting for connections...

5.下載安裝tpm-tools

 BUILDING tpm-tools
 -------- ---------
 $ sh ./bootstrap.sh
 $ ./configure
 $ make
 # make install

 By default the build will place everything in /usr/local. Issue
   ./configure --help
 to see how to install to a different location.

安裝完之后,敲入tpm然后tab健,就可以看到新增了很多命令了:

tpm_changeownerauth  tpm_nvinfo           tpm_restrictpubek    tpm_setactive        tpm_setpresence      tpmtool
tpm_clear            tpm_nvread           tpm_restrictsrk      tpm_setclearable     tpm_takeownership    
tpm_createek         tpm_nvrelease        tpm_revokeek         tpm_setenable        tpm_unsealdata       
tpm_getpubek         tpm_nvwrite          tpm_sealdata         tpm_setoperatorauth  tpm_version          
tpm_nvdefine         tpm_resetdalock      tpm_selftest         tpm_setownable       tpmd   

 

下面是最終的測試了:

# tpm_takeownership
Enter owner password:
Confirm password:
Enter SRK password:
Confirm password:

設置兩個密碼,要記住,后面要用到。

# ./tpm_version 
LOG_DEBUG TSPI rpc/tcstp/rpc.c:362 Sending TSP packet to host localhost.
LOG_DEBUG TSPI rpc/tcstp/rpc.c:377 Connecting to 127.0.0.1
LOG_DEBUG TSPI rpc/tcstp/rpc_context.c:44 RPC_OpenContext_TP: Received TCS Context: 0xa0d40600
LOG_DEBUG TSPI rpc/tcstp/rpc_caps_tpm.c:40 RPC_GetTPMCapability_TP: TCS Context: 0xa0d40600
  TPM 1.2 Version Info:
  Chip Version:        1.2.0.7
  Spec Level:          2
  Errata Revision:     1
  TPM Vendor ID:       ETHZ
LOG_DEBUG TSPI rpc/tcstp/rpc_caps_tpm.c:40 RPC_GetTPMCapability_TP: TCS Context: 0xa0d40600
  TPM Version:         01010000
LOG_DEBUG TSPI rpc/tcstp/rpc_caps_tpm.c:40 RPC_GetTPMCapability_TP: TCS Context: 0xa0d40600
  Manufacturer Info:   4554485a
LOG_DEBUG TSPI rpc/tcstp/rpc_context.c:60 RPC_CloseContext_TP: TCS Context: 0xa0d40600
LOG_RETERR TSPI tspi_context.c:113: 0x126

加密某個文件:

tpm_sealdata  -i  /home/caq/Path_test/caq.txt -p 4 -p 8 -p 9 -p 12 -p 14  -o  /home/caq/Path_test/sealed_key

會要求輸入srk的密碼,就是剛才設置的第二個密碼。

加密后的文件內容:

-----BEGIN TSS-----
-----TSS KEY-----
AQEAAAARAAAABAEAAAABAAMAAQAAAAwAAAgAAAAAAgAAAAAAAAAAAAABANxiK5q8
Nfx/spy+mnJgRpRAaEgBhvT3bTDdV9gNSdy6hryJGNKkIsQCSdam1Yo28DPHiB9i
iout25PXLi9VaNLmlT7UPVMTReujGhSMWk5pkejpNd0He+CoTyov6CveHnk7YqXa
Hp1ipsg98+IVLrhshPkbW4yq6/PEK07Za56Cj0gVDQ1S+3zkZY8wegPilXG79GQ8
j/yHaPar62jExVfGuoOtPsUINFAcgvWO14Syq30ZM0Dr4aTGcj4XjKqrRtuuiE7y
qkQM37DM1x7/EYgg9/ITIpR3fVTP7hEuo+qPyfUy8rEINAoTCBiBN/53r84xdA+y
t+Ic1tt+qSJi/t8AAAEAq+dKuhTIuoo75gKIkRfiEbpeUn3yK3sHJTkZKwJudMyp
1f1oYegR48lhatQhgRPC5nfKBG/7N/VoKb9KQMA/XuFM4iKVdfqckSnnq8s97Exh
7cK9DHPWDLCChk/Fa6xPR4AIcq6Qj4DTiESQeb66ZGGl/DSKzMLQwYFeg011UmI9
5r4sb3vdkCVIj2suuLQpbmc80O9rLsHmo7z68SNB8HgHFSR/LQeywoPa4Gq5xFsH
/qDRSS5rayvd1+/W3n7bhlj1Byym6/T9Yjzgsycm1TlqWlY7uX9wiXP63y29IAzQ
sTnK1eTWfU2KrmpZznmwoa9oxjGuzvMPdplyMV4O2Q==
-----ENC KEY-----
Symmetric Key: AES-256-CBC
AQEAAAAAACwAAhBTkyUEalmn0CnsJOCtGAt3AocthliTJQRqWafQKewk4K0YC3cC
hy2GWAAAAQBvqgwWrpyJ0pTdR4aNEvq+YfQ+58GyISxMLh/DziwijcwZ5VZf03Ps
+vLq876xOSuo3SDbKJfHas7JHasxq5WnX8j50VqTubvHXQ6H2y3Frtp3suG6LQgT
kI4DNTrkHXMbp8AJU5Euk4DGf7dXKeKbu/XBsKqoY0FP61WgrSMU6wCGI3nQ0esW
ARdVBoZkWl4Gf7KHb+Jhkfyh8T+1vn63IZ31BvaJBjlQDTGqJofDvaBkR6ceKrAD
h9G1EA0NUc9Grwv59L0onyZ7R6D7P2lgCheLsvyt2gFr0bxyMm78D1Fuywx5iZtx
7e7iToJSld4tq7LJep8Rf/f7Bo9DvJnL
-----ENC DAT-----
UxkNGTc11B7eIdPUx65IsA==
-----END TSS-----

解密這個文件:

tpm_unsealdata  -i  /home/caq/Path_test/sealed_key -o hah

也要求輸入密碼,密碼輸入錯誤是拒絕解密的。

tpm_sealdata  -i  /home/caq/Path_test/sealed_key -o hah
LOG_DEBUG TSPI rpc/tcstp/rpc.c:362 Sending TSP packet to host localhost.
LOG_DEBUG TSPI rpc/tcstp/rpc.c:377 Connecting to 127.0.0.1
LOG_DEBUG TSPI rpc/tcstp/rpc_context.c:44 RPC_OpenContext_TP: Received TCS Context: 0xa0b0fe15
LOG_DEBUG TSPI rpc/tcstp/rpc_random.c:37 RPC_GetRandom_TP: TCS Context: 0xa0b0fe15
LOG_DEBUG TSPI rpc/tcstp/rpc_ps.c:318 RPC_LoadKeyByUUID_TP: TCS Context: 0xa0b0fe15
LOG_DEBUG TSPI rpc/tcstp/rpc_ps.c:339 RPC_LoadKeyByUUID_TP: TCS key handle: 0x40000000
LOG_DEBUG TSPI rpc/tcstp/rpc_ps.c:274 RPC_GetRegisteredKeyBlob_TP: TCS Context: 0xa0b0fe15
Enter SRK password: 
LOG_DEBUG TSPI rpc/tcstp/rpc_auth.c:70 RPC_OSAP_TP: TCS Context: 0xa0b0fe15
LOG_DEBUG TSPI rpc/tcstp/rpc_key.c:119 RPC_CreateWrapKey_TP: TCS Context: 0xa0b0fe15
LOG_DEBUG TSPI rpc/tcstp/rpc_auth.c:37 RPC_OIAP_TP: TCS Context: 0xa0b0fe15
LOG_DEBUG TSPI obj_policy.c:230 Got a secret:
36 F7 7C 80 32 12 AD 05 7D 36 63 03 76 D2 85 2E 
24 72 D6 4D 
LOG_DEBUG TSPI rpc/tcstp/rpc_key.c:42 RPC_LoadKeyByBlob_TP: IN: TCS Context: 0xa0b0fe15
LOG_DEBUG TSPI rpc/tcstp/rpc_key.c:75 RPC_LoadKeyByBlob_TP: OUT: TCS key handle: 0x2233000d, TPM key slot: 0xb
LOG_DEBUG TSPI rpc/tcstp/rpc_auth.c:70 RPC_OSAP_TP: TCS Context: 0xa0b0fe15
LOG_DEBUG TSPI rpc/tcstp/rpc_seal.c:46 common_Seal_TP: TCS Context: 0xa0b0fe15
LOG_DEBUG TSPI rpc/tcstp/rpc_context.c:60 RPC_CloseContext_TP: TCS Context: 0xa0b0fe15
LOG_RETERR TSPI tspi_context.c:113: 0x126

 

其他的一些使用方法,可以tpm_unsealdata  -h來找到方法。解密之后,diff對比下加密前的文件,可以看到兩者是一樣的。

模擬器和芯片的區別,就是秘鑰的存放位置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM