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