]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c
SecurityPkg Tcg2ConfigDxe: Add setup option to configure PPI version
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigDriver.c
CommitLineData
1abfa4ce
JY
1/** @file\r
2 The module entry point for Tcg2 configuration module.\r
3\r
dd6d0a52 4Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>\r
1abfa4ce
JY
5This program and the accompanying materials \r
6are licensed and made available under the terms and conditions of the BSD License \r
7which accompanies this distribution. The full text of the license may be found at \r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "Tcg2ConfigImpl.h"\r
16\r
17extern TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1];\r
18\r
19/**\r
20 Update default PCR banks data.\r
21\r
22 @param[in] HiiPackage HII Package.\r
23 @param[in] HiiPackageSize HII Package size.\r
24 @param[in] PCRBanks PCR Banks data.\r
25\r
26**/\r
27VOID\r
28UpdateDefaultPCRBanks (\r
29 IN VOID *HiiPackage,\r
30 IN UINTN HiiPackageSize,\r
31 IN UINT32 PCRBanks\r
32 )\r
33{\r
34 EFI_HII_PACKAGE_HEADER *HiiPackageHeader;\r
35 EFI_IFR_OP_HEADER *IfrOpCodeHeader;\r
36 EFI_IFR_CHECKBOX *IfrCheckBox;\r
37 EFI_IFR_DEFAULT *IfrDefault;\r
38\r
39 HiiPackageHeader = (EFI_HII_PACKAGE_HEADER *)HiiPackage;\r
40\r
41 switch (HiiPackageHeader->Type) {\r
42 case EFI_HII_PACKAGE_FORMS:\r
43 IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)(HiiPackageHeader + 1);\r
44 while ((UINTN)IfrOpCodeHeader < (UINTN)HiiPackageHeader + HiiPackageHeader->Length) {\r
45 switch (IfrOpCodeHeader->OpCode) {\r
46 case EFI_IFR_CHECKBOX_OP:\r
47 IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpCodeHeader;\r
48 if ((IfrCheckBox->Question.QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (IfrCheckBox->Question.QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) {\r
49 IfrDefault = (EFI_IFR_DEFAULT *)(IfrCheckBox + 1);\r
50 ASSERT (IfrDefault->Header.OpCode == EFI_IFR_DEFAULT_OP);\r
51 ASSERT (IfrDefault->Type == EFI_IFR_TYPE_BOOLEAN);\r
52 IfrDefault->Value.b = (BOOLEAN)((PCRBanks >> (IfrCheckBox->Question.QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0)) & 0x1);\r
53 }\r
54 break;\r
55 }\r
56 IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)((UINTN)IfrOpCodeHeader + IfrOpCodeHeader->Length);\r
57 }\r
58 break;\r
59 }\r
60 return ;\r
61}\r
62\r
dd6d0a52
SZ
63/**\r
64 Initialize TCG2 version information.\r
65\r
66 This function will initialize efi varstore configuration data for\r
67 TCG2_VERSION_NAME variable, check the value of related PCD with\r
68 the variable value and set string for the version state content\r
69 according to the PCD value.\r
70\r
71 @param[in] PrivateData Points to TCG2 configuration private data.\r
72\r
73**/\r
74VOID\r
75InitializeTcg2VersionInfo (\r
76 IN TCG2_CONFIG_PRIVATE_DATA *PrivateData\r
77 )\r
78{\r
79 EFI_STATUS Status;\r
80 EFI_STRING ConfigRequestHdr;\r
81 BOOLEAN ActionFlag;\r
82 TCG2_VERSION Tcg2Version;\r
83 UINTN DataSize;\r
84 UINT64 PcdTcg2PpiVersion;\r
85\r
86 //\r
87 // Get the PCD value before initializing efi varstore configuration data.\r
88 //\r
89 PcdTcg2PpiVersion = 0;\r
90 CopyMem (\r
91 &PcdTcg2PpiVersion,\r
92 PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
93 AsciiStrSize (PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
94 );\r
95\r
96 //\r
97 // Initialize efi varstore configuration data.\r
98 //\r
99 ZeroMem (&Tcg2Version, sizeof (Tcg2Version));\r
100 ConfigRequestHdr = HiiConstructConfigHdr (\r
101 &gTcg2ConfigFormSetGuid,\r
102 TCG2_VERSION_NAME,\r
103 PrivateData->DriverHandle\r
104 );\r
105 ASSERT (ConfigRequestHdr != NULL);\r
106 DataSize = sizeof (Tcg2Version);\r
107 Status = gRT->GetVariable (\r
108 TCG2_VERSION_NAME,\r
109 &gTcg2ConfigFormSetGuid,\r
110 NULL,\r
111 &DataSize,\r
112 &Tcg2Version\r
113 );\r
114 if (!EFI_ERROR (Status)) {\r
115 //\r
116 // EFI variable does exist and validate current setting.\r
117 //\r
118 ActionFlag = HiiValidateSettings (ConfigRequestHdr);\r
119 if (!ActionFlag) {\r
120 //\r
121 // Current configuration is invalid, reset to defaults.\r
122 //\r
123 ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
124 ASSERT (ActionFlag);\r
125 //\r
126 // Get the default values from variable.\r
127 //\r
128 DataSize = sizeof (Tcg2Version);\r
129 Status = gRT->GetVariable (\r
130 TCG2_VERSION_NAME,\r
131 &gTcg2ConfigFormSetGuid,\r
132 NULL,\r
133 &DataSize,\r
134 &Tcg2Version\r
135 );\r
136 ASSERT_EFI_ERROR (Status);\r
137 }\r
138 } else {\r
139 //\r
140 // EFI variable doesn't exist.\r
141 //\r
142\r
143 //\r
144 // Store zero data Buffer Storage to EFI variable.\r
145 //\r
146 Status = gRT->SetVariable (\r
147 TCG2_VERSION_NAME,\r
148 &gTcg2ConfigFormSetGuid,\r
149 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
150 sizeof (Tcg2Version),\r
151 &Tcg2Version\r
152 );\r
153 if (EFI_ERROR (Status)) {\r
154 DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_VERSION_NAME\n"));\r
155 return;\r
156 } else {\r
157 //\r
158 // Build this variable based on default values stored in IFR.\r
159 //\r
160 ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
161 ASSERT (ActionFlag);\r
162 //\r
163 // Get the default values from variable.\r
164 //\r
165 DataSize = sizeof (Tcg2Version);\r
166 Status = gRT->GetVariable (\r
167 TCG2_VERSION_NAME,\r
168 &gTcg2ConfigFormSetGuid,\r
169 NULL,\r
170 &DataSize,\r
171 &Tcg2Version\r
172 );\r
173 ASSERT_EFI_ERROR (Status);\r
174 if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) {\r
175 DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer default value is not same with the default value in VFR\n"));\r
176 DEBUG ((DEBUG_WARN, "WARNING: The default value in VFR has be chosen\n"));\r
177 }\r
178 }\r
179 }\r
180 FreePool (ConfigRequestHdr);\r
181\r
182 //\r
183 // Get the PCD value again.\r
184 // If the PCD value is not equal to the value in variable,\r
185 // the PCD is not DynamicHii type and maps to the setup option.\r
186 //\r
187 PcdTcg2PpiVersion = 0;\r
188 CopyMem (\r
189 &PcdTcg2PpiVersion,\r
190 PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
191 AsciiStrSize (PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
192 );\r
193 if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) {\r
194 DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer is not DynamicHii type and maps to TCG2_VERSION.PpiVersion\n"));\r
195 DEBUG ((DEBUG_WARN, "WARNING: The TCG2 PPI version configuring from setup page will not work\n"));\r
196 }\r
197\r
198 switch (PcdTcg2PpiVersion) {\r
199 case TCG2_PPI_VERSION_1_2:\r
200 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_PPI_VERSION_STATE_CONTENT), L"1.2", NULL);\r
201 break;\r
202 case TCG2_PPI_VERSION_1_3:\r
203 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_PPI_VERSION_STATE_CONTENT), L"1.3", NULL);\r
204 break;\r
205 default:\r
206 ASSERT (FALSE);\r
207 break;\r
208 }\r
209}\r
210\r
1abfa4ce
JY
211/**\r
212 The entry point for Tcg2 configuration driver.\r
213\r
214 @param[in] ImageHandle The image handle of the driver.\r
215 @param[in] SystemTable The system table.\r
216\r
217 @retval EFI_ALREADY_STARTED The driver already exists in system.\r
218 @retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources.\r
219 @retval EFI_SUCCES All the related protocols are installed on the driver.\r
220 @retval Others Fail to install protocols as indicated.\r
221\r
222**/\r
223EFI_STATUS\r
224EFIAPI\r
225Tcg2ConfigDriverEntryPoint (\r
226 IN EFI_HANDLE ImageHandle,\r
227 IN EFI_SYSTEM_TABLE *SystemTable\r
228 )\r
229{\r
230 EFI_STATUS Status;\r
231 TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
232 TCG2_CONFIGURATION Tcg2Configuration;\r
233 TCG2_DEVICE_DETECTION Tcg2DeviceDetection;\r
234 UINTN Index;\r
235 UINTN DataSize;\r
236 EDKII_VARIABLE_LOCK_PROTOCOL *VariableLockProtocol;\r
237 UINT32 CurrentActivePCRBanks;\r
238\r
239 Status = gBS->OpenProtocol (\r
240 ImageHandle,\r
241 &gEfiCallerIdGuid,\r
242 NULL,\r
243 ImageHandle,\r
244 ImageHandle,\r
245 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
246 );\r
247 if (!EFI_ERROR (Status)) {\r
248 return EFI_ALREADY_STARTED;\r
249 }\r
250 \r
251 //\r
252 // Create a private data structure.\r
253 //\r
254 PrivateData = AllocateCopyPool (sizeof (TCG2_CONFIG_PRIVATE_DATA), &mTcg2ConfigPrivateDateTemplate);\r
255 ASSERT (PrivateData != NULL);\r
256 mTcg2ConfigPrivateDate = PrivateData;\r
257 //\r
258 // Install private GUID.\r
259 // \r
260 Status = gBS->InstallMultipleProtocolInterfaces (\r
261 &ImageHandle,\r
262 &gEfiCallerIdGuid,\r
263 PrivateData,\r
264 NULL\r
265 );\r
266 ASSERT_EFI_ERROR (Status);\r
267\r
268 Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) &PrivateData->Tcg2Protocol);\r
269 ASSERT_EFI_ERROR (Status);\r
270\r
271 PrivateData->ProtocolCapability.Size = sizeof(PrivateData->ProtocolCapability);\r
272 Status = PrivateData->Tcg2Protocol->GetCapability (\r
273 PrivateData->Tcg2Protocol,\r
274 &PrivateData->ProtocolCapability\r
275 );\r
276 ASSERT_EFI_ERROR (Status);\r
277\r
278 DataSize = sizeof(Tcg2Configuration);\r
279 Status = gRT->GetVariable (\r
280 TCG2_STORAGE_NAME,\r
281 &gTcg2ConfigFormSetGuid,\r
282 NULL,\r
283 &DataSize,\r
284 &Tcg2Configuration\r
285 );\r
286 if (EFI_ERROR (Status)) {\r
287 //\r
288 // Variable not ready, set default value\r
289 //\r
290 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
291 }\r
292\r
293 //\r
294 // Validation\r
295 //\r
296 if ((Tcg2Configuration.TpmDevice > TPM_DEVICE_MAX) || (Tcg2Configuration.TpmDevice < TPM_DEVICE_MIN)) {\r
297 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
298 }\r
299\r
300 //\r
301 // Set value for Tcg2CurrentActivePCRBanks\r
302 // Search Tcg2ConfigBin[] and update default value there\r
303 //\r
304 Status = PrivateData->Tcg2Protocol->GetActivePcrBanks (PrivateData->Tcg2Protocol, &CurrentActivePCRBanks);\r
305 ASSERT_EFI_ERROR (Status);\r
306 PrivateData->PCRBanksDesired = CurrentActivePCRBanks;\r
307 UpdateDefaultPCRBanks (Tcg2ConfigBin + sizeof(UINT32), ReadUnaligned32((UINT32 *)Tcg2ConfigBin) - sizeof(UINT32), CurrentActivePCRBanks);\r
308\r
1abfa4ce
JY
309 //\r
310 // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
311 //\r
312 Tcg2DeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL;\r
313 for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
314 if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
315 Tcg2DeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;\r
316 break;\r
317 }\r
318 }\r
319\r
320 PrivateData->TpmDeviceDetected = Tcg2DeviceDetection.TpmDeviceDetected;\r
518b6f65 321 Tcg2Configuration.TpmDevice = Tcg2DeviceDetection.TpmDeviceDetected;\r
1abfa4ce
JY
322\r
323 //\r
324 // Save to variable so platform driver can get it.\r
325 //\r
326 Status = gRT->SetVariable (\r
327 TCG2_DEVICE_DETECTION_NAME,\r
328 &gTcg2ConfigFormSetGuid,\r
329 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
330 sizeof(Tcg2DeviceDetection),\r
331 &Tcg2DeviceDetection\r
332 );\r
333 if (EFI_ERROR (Status)) {\r
334 DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_DEVICE_DETECTION_NAME\n"));\r
335 Status = gRT->SetVariable (\r
336 TCG2_DEVICE_DETECTION_NAME,\r
337 &gTcg2ConfigFormSetGuid,\r
338 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
339 0,\r
340 NULL\r
341 );\r
342 ASSERT_EFI_ERROR (Status);\r
343 }\r
344\r
518b6f65
JY
345 //\r
346 // Save to variable so platform driver can get it.\r
347 //\r
348 Status = gRT->SetVariable (\r
349 TCG2_STORAGE_NAME,\r
350 &gTcg2ConfigFormSetGuid,\r
351 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
352 sizeof(Tcg2Configuration),\r
353 &Tcg2Configuration\r
354 );\r
355 if (EFI_ERROR (Status)) {\r
356 DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n"));\r
357 }\r
358\r
1abfa4ce
JY
359 //\r
360 // We should lock Tcg2DeviceDetection, because it contains information needed at S3.\r
361 //\r
362 Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol);\r
363 if (!EFI_ERROR (Status)) {\r
364 Status = VariableLockProtocol->RequestToLock (\r
365 VariableLockProtocol,\r
366 TCG2_DEVICE_DETECTION_NAME,\r
367 &gTcg2ConfigFormSetGuid\r
368 );\r
369 ASSERT_EFI_ERROR (Status);\r
370 }\r
371 \r
372 //\r
373 // Install Tcg2 configuration form\r
374 //\r
375 Status = InstallTcg2ConfigForm (PrivateData);\r
376 if (EFI_ERROR (Status)) {\r
377 goto ErrorExit;\r
378 }\r
379\r
dd6d0a52
SZ
380 InitializeTcg2VersionInfo (PrivateData);\r
381\r
1abfa4ce
JY
382 return EFI_SUCCESS;\r
383\r
384ErrorExit:\r
385 if (PrivateData != NULL) {\r
386 UninstallTcg2ConfigForm (PrivateData);\r
387 } \r
388 \r
389 return Status;\r
390}\r
391\r
392/**\r
393 Unload the Tcg2 configuration form.\r
394\r
395 @param[in] ImageHandle The driver's image handle.\r
396\r
397 @retval EFI_SUCCESS The Tcg2 configuration form is unloaded.\r
398 @retval Others Failed to unload the form.\r
399\r
400**/\r
401EFI_STATUS\r
402EFIAPI\r
403Tcg2ConfigDriverUnload (\r
404 IN EFI_HANDLE ImageHandle\r
405 )\r
406{\r
407 EFI_STATUS Status;\r
408 TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
409\r
410 Status = gBS->HandleProtocol (\r
411 ImageHandle,\r
412 &gEfiCallerIdGuid,\r
413 (VOID **) &PrivateData\r
414 ); \r
415 if (EFI_ERROR (Status)) {\r
416 return Status; \r
417 }\r
418 \r
419 ASSERT (PrivateData->Signature == TCG2_CONFIG_PRIVATE_DATA_SIGNATURE);\r
420\r
421 gBS->UninstallMultipleProtocolInterfaces (\r
422 &ImageHandle,\r
423 &gEfiCallerIdGuid,\r
424 PrivateData,\r
425 NULL\r
426 );\r
427 \r
428 UninstallTcg2ConfigForm (PrivateData);\r
429\r
430 return EFI_SUCCESS;\r
431}\r