1 #include "tpm.hpp" 2 3 #include "mdrv2.hpp" 4 5 #include <fstream> 6 #include <iomanip> 7 #include <iostream> 8 #include <sstream> 9 10 namespace phosphor 11 { 12 namespace smbios 13 { 14 tpmInfoUpdate(uint8_t * smbiosTableStorage,const std::string & motherboard)15 void Tpm::tpmInfoUpdate(uint8_t* smbiosTableStorage, 16 const std::string& motherboard) 17 { 18 storage = smbiosTableStorage; 19 motherboardPath = motherboard; 20 21 uint8_t* dataIn = storage; 22 dataIn = getSMBIOSTypePtr(dataIn, tpmDeviceType); 23 if (dataIn == nullptr) 24 { 25 return; 26 } 27 for (uint8_t index = 0; index < tpmId; index++) 28 { 29 dataIn = smbiosNextPtr(dataIn); 30 if (dataIn == nullptr) 31 { 32 return; 33 } 34 dataIn = getSMBIOSTypePtr(dataIn, tpmDeviceType); 35 if (dataIn == nullptr) 36 { 37 return; 38 } 39 } 40 auto tpmInfo = reinterpret_cast<struct TPMInfo*>(dataIn); 41 42 present(true); 43 purpose(softwareversion::VersionPurpose::Other); 44 tpmVendor(tpmInfo); 45 tpmFirmwareVersion(tpmInfo); 46 tpmDescription(tpmInfo->description, tpmInfo->length, dataIn); 47 if (!motherboardPath.empty()) 48 { 49 std::vector<std::tuple<std::string, std::string, std::string>> assocs; 50 assocs.emplace_back("chassis", "trusted_components", motherboardPath); 51 association::associations(assocs); 52 } 53 } 54 tpmVendor(const struct TPMInfo * tpmInfo)55 void Tpm::tpmVendor(const struct TPMInfo* tpmInfo) 56 { 57 constexpr int vendorIdLength = 4; 58 // Specified as four ASCII characters, as defined by TCG Vendor ID 59 char vendorId[vendorIdLength + 1]; 60 int i; 61 for (i = 0; i < vendorIdLength && tpmInfo->vendor[i] != '\0'; i++) 62 { 63 if (std::isprint(tpmInfo->vendor[i])) 64 { 65 vendorId[i] = tpmInfo->vendor[i]; 66 } 67 else 68 { 69 vendorId[i] = '.'; 70 } 71 } 72 vendorId[i] = '\0'; 73 manufacturer(vendorId); 74 } 75 tpmFirmwareVersion(const struct TPMInfo * tpmInfo)76 void Tpm::tpmFirmwareVersion(const struct TPMInfo* tpmInfo) 77 { 78 std::stringstream stream; 79 80 if (tpmInfo->specMajor == tpmMajorVerion1) 81 { 82 auto ver = reinterpret_cast<const struct TPMVersionSpec1*>( 83 &tpmInfo->firmwareVersion1); 84 stream << ver->revMajor << "." << ver->revMinor; 85 } 86 else if (tpmInfo->specMajor == tpmMajorVerion2) 87 { 88 auto ver = reinterpret_cast<const struct TPMVersionSpec2*>( 89 &tpmInfo->firmwareVersion1); 90 stream << ver->revMajor << "." << ver->revMinor; 91 } 92 version(stream.str()); 93 } 94 tpmDescription(const uint8_t positionNum,const uint8_t structLen,uint8_t * dataIn)95 void Tpm::tpmDescription(const uint8_t positionNum, const uint8_t structLen, 96 uint8_t* dataIn) 97 { 98 std::string result = positionToString(positionNum, structLen, dataIn); 99 prettyName(result); 100 } 101 } // namespace smbios 102 } // namespace phosphor 103