기본적인 TPM(Trusted Platform Module) 프로그래밍에 대해 알아봅시다. 



 준비 단계 

먼저 필요한 라이브러리들을 설치해야 합니다. 


  • Fedora계열 

# yum install trousers tpm-tools trousers-devel 


  • debian 계열 

$ sudo apt-get install trousers tpm-tools libtspi-dev 


설치를 완료하고 난 후에는 TPM의 takeownership 명령을 수행해서 사용 권한을 획득해야 합니다. 자세한건 이전에 쓴 글을 참고하시면 됩니다. 



 알고 넘어가기  


  • TSS 아키텍처는 아래 그림과 같습니다. 


Architectural overview of the TSSArchitectural overview of the TSS

TPM 프로그래밍에서는 Tspi라이브러리 들을 사용합니다.


  • 다음 라이브러리들은 미리 추가해 두고 시작하는게 편합니다. 


#include <stdio.h>

#include <string.h>

#include <tss/tss_error.h>

#include <tss/platform.h>

#include <tss/tss_defines.h>

#include <tss/tss_typedef.h>

#include <tss/tss_structs.h>

#include <tss/tspi.h>

#include <trousers/trousers.h>


  • 디버깅 함수를 미리 정의해 두고 사용하면 편합니다. 


#define DEBUG 1

#define DBG(message,tResult) if(DEBUG) {printf("(Line %d, %s) %s returned 0x%08x. %s.\n", __LINE__, __func__, message, tResult, Trspi_Error_String(tResult));}


tResult값은 Tspi명령을 수행한 후 리턴 받은 값을 넣어주면 됩니다. 



  • 프로그램 초반부에 항상 필요한 값들은 미리 알아두면 편합니다. 


1. TSS_HCONTEXT 


TSS_HCONTEXT  hContext;

result =Tspi_Context_Create(&hContext);

result=Tspi_Context_Connect(hContext, NULL);



2. TSS_HTPM


TSS_HTPM hTPM;

result=Tspi_Context_GetTpmObject(hContext, &hTPM);



3. TSS_HKEY


TSS_HKEY hSRK;

TSS_UUID SRK_UUID = TSS_UUID_SRK;

result=Tspi_Context_LoadKeyByUUID(hContext, TSS_PS_TYPE_SYSTEM, SRK_UUID, &hSRK);


이 외의 TSS 변수들은  'include/tss/tss_typedef.h' 파일을 참고하면 됩니다. 



  • 모든 작업을 완료한 후에는 불필요한 자원을 해제해주면 됩니다. 

Tspi_Context_Close (h objects you have created);

Tspi_Context_FreeMemory(hContext, NULL);

Tspi_Context_Close(hContext);



필요한 기능 구현하기 


1. 키 생성 - 서명키(signing key)



2. 키 저장 및 로드 



3. 공개키 생성 후 파일로 저장



4. 데이터 해시 (Hashing data)



5. 데이터 실링 (Sealing data)



6. 서명 및 검증 (signing and verify)



7. 랜덤 넘버 생성 


즐거운 TPM 프로그래밍 하세요~


Posted by KT한
,