Advertisement
Guest User

Untitled

a guest
May 17th, 2021
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.96 KB | None | 0 0
  1. #include <tss2/tss2_esys.h>
  2. #include <tss2/tss2_tctildr.h>
  3.  
  4. #include <iomanip>
  5. #include <vector>
  6. #include <iostream>
  7.  
  8. int main() {
  9.     // INITIALIZE
  10.     TSS2_TCTI_CONTEXT *tcti = NULL;
  11.     const char *tcti_conf_option = NULL;
  12.     tcti_conf_option = getenv("TPM2TOOLS_TCTI");
  13.     Tss2_TctiLdr_Initialize(tcti_conf_option, &tcti);
  14.  
  15.  
  16.     ESYS_CONTEXT* esysContext;
  17.     Esys_Initialize(&esysContext, tcti, nullptr);
  18.  
  19.     //Get Capability
  20.     TPMS_CAPABILITY_DATA* tpmsCapabilityData;
  21.     Esys_GetCapability(esysContext,
  22.                       ESYS_TR_NONE,
  23.                       ESYS_TR_NONE,
  24.                       ESYS_TR_NONE,
  25.                       TPM2_CAP_HANDLES,
  26.                       TPM2_HR_NV_INDEX,
  27.                       TPM2_PT_NV_INDEX_MAX,
  28.                       nullptr,
  29.                       &tpmsCapabilityData);
  30.  
  31.     std::vector<uint32_t> capabilityData;
  32.     for (uint32_t i = 0; i < tpmsCapabilityData->data.handles.count; i++)
  33.     {
  34.         capabilityData.push_back((uint32_t)tpmsCapabilityData->data.handles.handle[i]);
  35.     }
  36.    
  37.     for (const auto& data : capabilityData) {
  38.         std::cout <<std::hex << data << std::endl;
  39.     }
  40.  
  41.     auto address = capabilityData[0];
  42.  
  43.    
  44.     // Read from TPM
  45.    
  46.     TPM2_HANDLE nv_index = address;
  47.     ESYS_TR nvHandle = ESYS_TR_NONE;
  48.    
  49.     Esys_TR_FromTPMPublic(esysContext, nv_index, ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE, &nvHandle);
  50.     std::cout << "NvHandle: "<< std::hex << nvHandle << std::endl;
  51.  
  52.     TPM2B_NV_PUBLIC *nvPublic = NULL;
  53.     Esys_NV_ReadPublic(esysContext, nvHandle, ESYS_TR_NONE, ESYS_TR_NONE, ESYS_TR_NONE, &nvPublic, NULL);
  54.     std::cout << "Data size: " << nvPublic->nvPublic.dataSize << std::endl;
  55.  
  56.     // Create Session
  57.  
  58.     TPMT_SYM_DEF symmetric{};
  59.     symmetric.algorithm = TPM2_ALG_NULL;
  60.     ESYS_TR session = ESYS_TR_NONE;
  61.  
  62.     Esys_StartAuthSession(esysContext,
  63.                                   ESYS_TR_NONE,
  64.                                   ESYS_TR_NONE,
  65.                                   ESYS_TR_NONE,
  66.                                   ESYS_TR_NONE,
  67.                                   ESYS_TR_NONE,
  68.                                   NULL,
  69.                                   TPM2_SE_HMAC,
  70.                                   &symmetric,
  71.                                   TPM2_ALG_SHA256,
  72.                                   &session);
  73.  
  74.  
  75.     TPM2B_AUTH *auth = nullptr;
  76.     Esys_TR_SetAuth(esysContext, ESYS_TR_RH_OWNER, auth);
  77.  
  78.     TPM2B_MAX_NV_BUFFER* dataCertificateBuffer = NULL;
  79.     Esys_NV_Read(esysContext,
  80.                      nvHandle,
  81.                      nvHandle,
  82.                      session, ESYS_TR_NONE, ESYS_TR_NONE,
  83.                      nvPublic->nvPublic.dataSize,
  84.                      0,
  85.                      &dataCertificateBuffer);
  86.  
  87.     // Clean
  88.     Esys_Free(auth);
  89.     Esys_Free(tpmsCapabilityData);
  90.     Esys_Free(nvPublic);
  91.     Esys_Free(dataCertificateBuffer);
  92.     Esys_Finalize(&esysContext);
  93.     Esys_Free(esysContext);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement