]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c
SecurityPkg: Tcg2ConfigDxe: Display TPM2 HID in Tcg2Config
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigImpl.c
CommitLineData
1abfa4ce
JY
1/** @file\r
2 HII Config Access protocol implementation of TCG2 configuration module.\r
3 NOTE: This module is only for reference only, each platform should have its own setup page.\r
4\r
a6e0e994 5Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>\r
1abfa4ce
JY
6This program and the accompanying materials \r
7are licensed and made available under the terms and conditions of the BSD License \r
8which accompanies this distribution. The full text of the license may be found at \r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "Tcg2ConfigImpl.h"\r
17#include <Library/PcdLib.h>\r
18#include <Library/Tpm2CommandLib.h>\r
518b6f65 19#include <Library/IoLib.h>\r
1abfa4ce
JY
20#include <Guid/TpmInstance.h>\r
21\r
518b6f65
JY
22#include <IndustryStandard/TpmPtp.h>\r
23\r
1abfa4ce
JY
24#define EFI_TCG2_EVENT_LOG_FORMAT_ALL (EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 | EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)\r
25\r
26TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1] = TPM_INSTANCE_ID_LIST;\r
27\r
28TCG2_CONFIG_PRIVATE_DATA *mTcg2ConfigPrivateDate;\r
29TCG2_CONFIG_PRIVATE_DATA mTcg2ConfigPrivateDateTemplate = {\r
30 TCG2_CONFIG_PRIVATE_DATA_SIGNATURE,\r
31 {\r
32 Tcg2ExtractConfig,\r
33 Tcg2RouteConfig,\r
34 Tcg2Callback\r
35 }\r
36};\r
37\r
38HII_VENDOR_DEVICE_PATH mTcg2HiiVendorDevicePath = {\r
39 {\r
40 {\r
41 HARDWARE_DEVICE_PATH,\r
42 HW_VENDOR_DP,\r
43 {\r
44 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
45 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
46 }\r
47 },\r
48 TCG2_CONFIG_FORM_SET_GUID\r
49 },\r
50 {\r
51 END_DEVICE_PATH_TYPE,\r
52 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
53 { \r
54 (UINT8) (END_DEVICE_PATH_LENGTH),\r
55 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
56 }\r
57 }\r
58};\r
59\r
60UINT8 mCurrentPpRequest;\r
61\r
518b6f65
JY
62/**\r
63 Return PTP interface type.\r
64\r
65 @param[in] Register Pointer to PTP register.\r
66\r
67 @return PTP interface type.\r
68**/\r
69UINT8\r
70GetPtpInterface (\r
71 IN VOID *Register\r
72 )\r
73{\r
74 PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
75 PTP_FIFO_INTERFACE_CAPABILITY InterfaceCapability;\r
76\r
77 //\r
78 // Check interface id\r
79 //\r
80 InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
81 InterfaceCapability.Uint32 = MmioRead32 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability);\r
82\r
83 if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) &&\r
84 (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) &&\r
85 (InterfaceId.Bits.CapCRB != 0)) {\r
86 return TPM_DEVICE_INTERFACE_PTP_CRB;\r
87 }\r
88 if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO) &&\r
89 (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_FIFO) &&\r
90 (InterfaceId.Bits.CapFIFO != 0) &&\r
91 (InterfaceCapability.Bits.InterfaceVersion == INTERFACE_CAPABILITY_INTERFACE_VERSION_PTP)) {\r
92 return TPM_DEVICE_INTERFACE_PTP_FIFO;\r
93 }\r
94 return TPM_DEVICE_INTERFACE_TIS;\r
95}\r
96\r
97/**\r
98 Return if PTP CRB is supported.\r
99\r
100 @param[in] Register Pointer to PTP register.\r
101 \r
102 @retval TRUE PTP CRB is supported.\r
103 @retval FALSE PTP CRB is unsupported.\r
104**/\r
105BOOLEAN\r
106IsPtpCrbSupported (\r
107 IN VOID *Register\r
108 )\r
109{\r
110 PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
111\r
112 //\r
113 // Check interface id\r
114 //\r
115 InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
116\r
117 if (((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) ||\r
118 (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO)) &&\r
119 (InterfaceId.Bits.CapCRB != 0)) {\r
120 return TRUE;\r
121 }\r
122 return FALSE;\r
123}\r
124\r
125/**\r
126 Return if PTP FIFO is supported.\r
127\r
128 @param[in] Register Pointer to PTP register.\r
129 \r
130 @retval TRUE PTP FIFO is supported.\r
131 @retval FALSE PTP FIFO is unsupported.\r
132**/\r
133BOOLEAN\r
134IsPtpFifoSupported (\r
135 IN VOID *Register\r
136 )\r
137{\r
138 PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
139\r
140 //\r
141 // Check interface id\r
142 //\r
143 InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
144\r
145 if (((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) ||\r
146 (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO)) &&\r
147 (InterfaceId.Bits.CapFIFO != 0)) {\r
148 return TRUE;\r
149 }\r
150 return FALSE;\r
151}\r
152\r
153/**\r
154 Set PTP interface type.\r
155\r
156 @param[in] Register Pointer to PTP register.\r
157 @param[in] PtpInterface PTP interface type.\r
158 \r
159 @retval EFI_SUCCESS PTP interface type is set.\r
160 @retval EFI_INVALID_PARAMETER PTP interface type is invalid.\r
161 @retval EFI_UNSUPPORTED PTP interface type is unsupported.\r
162 @retval EFI_WRITE_PROTECTED PTP interface is locked.\r
163**/\r
164EFI_STATUS\r
165SetPtpInterface (\r
166 IN VOID *Register,\r
167 IN UINT8 PtpInterface\r
168 )\r
169{\r
170 UINT8 PtpInterfaceCurrent;\r
171 PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
172\r
173 PtpInterfaceCurrent = GetPtpInterface (Register);\r
174 if ((PtpInterfaceCurrent != TPM_DEVICE_INTERFACE_PTP_FIFO) && \r
175 (PtpInterfaceCurrent != TPM_DEVICE_INTERFACE_PTP_CRB)) {\r
176 return EFI_UNSUPPORTED;\r
177 }\r
178 InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
179 if (InterfaceId.Bits.IntfSelLock != 0) {\r
180 return EFI_WRITE_PROTECTED;\r
181 }\r
182\r
183 switch (PtpInterface) {\r
184 case TPM_DEVICE_INTERFACE_PTP_FIFO:\r
185 if (InterfaceId.Bits.CapFIFO == 0) {\r
186 return EFI_UNSUPPORTED;\r
187 }\r
188 InterfaceId.Bits.InterfaceSelector = PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_FIFO;\r
189 MmioWrite32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId, InterfaceId.Uint32);\r
190 return EFI_SUCCESS;\r
191 case TPM_DEVICE_INTERFACE_PTP_CRB:\r
192 if (InterfaceId.Bits.CapCRB == 0) {\r
193 return EFI_UNSUPPORTED;\r
194 }\r
195 InterfaceId.Bits.InterfaceSelector = PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_CRB;\r
196 MmioWrite32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId, InterfaceId.Uint32);\r
197 return EFI_SUCCESS;\r
198 default:\r
199 return EFI_INVALID_PARAMETER;\r
200 }\r
201}\r
202\r
1abfa4ce
JY
203/**\r
204 This function allows a caller to extract the current configuration for one\r
205 or more named elements from the target driver.\r
206\r
207 @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
208 @param[in] Request A null-terminated Unicode string in\r
209 <ConfigRequest> format.\r
210 @param[out] Progress On return, points to a character in the Request\r
211 string. Points to the string's null terminator if\r
212 request was successful. Points to the most recent\r
213 '&' before the first failing name/value pair (or\r
214 the beginning of the string if the failure is in\r
215 the first name/value pair) if the request was not\r
216 successful.\r
217 @param[out] Results A null-terminated Unicode string in\r
218 <ConfigAltResp> format which has all values filled\r
219 in for the names in the Request string. String to\r
220 be allocated by the called function.\r
221\r
222 @retval EFI_SUCCESS The Results is filled with the requested values.\r
223 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
224 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
225 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
226 driver.\r
227\r
228**/\r
229EFI_STATUS\r
230EFIAPI\r
231Tcg2ExtractConfig (\r
232 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
233 IN CONST EFI_STRING Request,\r
234 OUT EFI_STRING *Progress,\r
235 OUT EFI_STRING *Results\r
236 )\r
237{\r
238 if (Progress == NULL || Results == NULL) {\r
239 return EFI_INVALID_PARAMETER;\r
240 }\r
241\r
242 *Progress = Request;\r
243 return EFI_NOT_FOUND;\r
244}\r
245\r
246/**\r
247 Save TPM request to variable space.\r
248\r
249 @param[in] PpRequest Physical Presence request command.\r
250\r
251 @retval EFI_SUCCESS The operation is finished successfully.\r
252 @retval Others Other errors as indicated.\r
253\r
254**/\r
255EFI_STATUS\r
256SaveTcg2PpRequest (\r
257 IN UINT8 PpRequest\r
258 )\r
259{\r
260 UINT32 ReturnCode;\r
261 EFI_STATUS Status;\r
262\r
263 ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
264 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
265 mCurrentPpRequest = PpRequest;\r
266 Status = EFI_SUCCESS;\r
267 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
268 Status = EFI_OUT_OF_RESOURCES;\r
269 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
270 Status = EFI_UNSUPPORTED;\r
271 } else {\r
272 Status = EFI_DEVICE_ERROR;\r
273 }\r
274\r
275 return Status;\r
276}\r
277\r
278/**\r
279 Save TPM request to variable space.\r
280\r
281 @param[in] PpRequestParameter Physical Presence request parameter.\r
282\r
283 @retval EFI_SUCCESS The operation is finished successfully.\r
284 @retval Others Other errors as indicated.\r
285\r
286**/\r
287EFI_STATUS\r
288SaveTcg2PpRequestParameter (\r
289 IN UINT32 PpRequestParameter\r
290 )\r
291{\r
292 UINT32 ReturnCode;\r
293 EFI_STATUS Status;\r
294\r
295 ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (mCurrentPpRequest, PpRequestParameter);\r
296 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
297 Status = EFI_SUCCESS;\r
298 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
299 Status = EFI_OUT_OF_RESOURCES;\r
300 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
301 Status = EFI_UNSUPPORTED;\r
302 } else {\r
303 Status = EFI_DEVICE_ERROR;\r
304 }\r
305\r
306 return Status;\r
307}\r
308\r
309/**\r
310 Save Tcg2 PCR Banks request request to variable space.\r
311\r
312 @param[in] PCRBankIndex PCR Bank Index.\r
313 @param[in] Enable Enable or disable this PCR Bank.\r
314\r
315 @retval EFI_SUCCESS The operation is finished successfully.\r
316 @retval Others Other errors as indicated.\r
317\r
318**/\r
319EFI_STATUS\r
320SaveTcg2PCRBanksRequest (\r
321 IN UINTN PCRBankIndex,\r
322 IN BOOLEAN Enable\r
323 )\r
324{\r
325 UINT32 ReturnCode;\r
326 EFI_STATUS Status;\r
327\r
328 if (Enable) {\r
329 mTcg2ConfigPrivateDate->PCRBanksDesired |= (0x1 << PCRBankIndex);\r
330 } else {\r
331 mTcg2ConfigPrivateDate->PCRBanksDesired &= ~(0x1 << PCRBankIndex);\r
332 }\r
333 \r
334 ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS, mTcg2ConfigPrivateDate->PCRBanksDesired);\r
335 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
336 Status = EFI_SUCCESS;\r
337 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
338 Status = EFI_OUT_OF_RESOURCES;\r
339 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
340 Status = EFI_UNSUPPORTED;\r
341 } else {\r
342 Status = EFI_DEVICE_ERROR;\r
343 }\r
344\r
345 return Status;\r
346}\r
347\r
348/**\r
349 This function processes the results of changes in configuration.\r
350\r
351 @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
352 @param[in] Configuration A null-terminated Unicode string in <ConfigResp>\r
353 format.\r
354 @param[out] Progress A pointer to a string filled in with the offset of\r
355 the most recent '&' before the first failing\r
356 name/value pair (or the beginning of the string if\r
357 the failure is in the first name/value pair) or\r
358 the terminating NULL if all was successful.\r
359\r
360 @retval EFI_SUCCESS The Results is processed successfully.\r
361 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
362 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
363 driver.\r
364\r
365**/\r
366EFI_STATUS\r
367EFIAPI\r
368Tcg2RouteConfig (\r
369 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
370 IN CONST EFI_STRING Configuration,\r
371 OUT EFI_STRING *Progress\r
372 )\r
373{\r
374 if (Configuration == NULL || Progress == NULL) {\r
375 return EFI_INVALID_PARAMETER;\r
376 }\r
377\r
378 return EFI_NOT_FOUND;\r
379}\r
380\r
a6e0e994
ZC
381/**\r
382 Get HID string of TPM2 ACPI device object\r
383\r
384 @param[in] HID Points to HID String Buffer.\r
385 @param[in] Size HID String size in bytes. Must >= TPM_HID_ACPI_SIZE\r
386\r
387 @return HID String get status.\r
388\r
389**/\r
390EFI_STATUS\r
391GetTpm2HID(\r
392 CHAR8 *HID,\r
393 UINTN Size\r
394 )\r
395{\r
396 EFI_STATUS Status;\r
397 UINT32 ManufacturerID;\r
398 UINT32 FirmwareVersion1;\r
399 UINT32 FirmwareVersion2;\r
400 BOOLEAN PnpHID;\r
401\r
402 PnpHID = TRUE;\r
403\r
404 ZeroMem(HID, Size);\r
405\r
406 //\r
407 // Get Manufacturer ID\r
408 //\r
409 Status = Tpm2GetCapabilityManufactureID(&ManufacturerID);\r
410 if (!EFI_ERROR(Status)) {\r
411 DEBUG((DEBUG_INFO, "TPM_PT_MANUFACTURER 0x%08x\n", ManufacturerID));\r
412 //\r
413 // ManufacturerID defined in TCG Vendor ID Registry\r
414 // may tailed with 0x00 or 0x20\r
415 //\r
416 if ((ManufacturerID >> 24) == 0x00 || ((ManufacturerID >> 24) == 0x20)) {\r
417 //\r
418 // HID containing PNP ID "NNN####"\r
419 // NNN is uppercase letter for Vendor ID specified by manufacturer\r
420 //\r
421 CopyMem(HID, &ManufacturerID, 3);\r
422 } else {\r
423 //\r
424 // HID containing ACP ID "NNNN####"\r
425 // NNNN is uppercase letter for Vendor ID specified by manufacturer\r
426 //\r
427 CopyMem(HID, &ManufacturerID, 4);\r
428 PnpHID = FALSE;\r
429 }\r
430 } else {\r
431 DEBUG ((DEBUG_ERROR, "Get TPM_PT_MANUFACTURER failed %x!\n", Status));\r
432 ASSERT(FALSE);\r
433 return Status;\r
434 }\r
435\r
436 Status = Tpm2GetCapabilityFirmwareVersion(&FirmwareVersion1, &FirmwareVersion2);\r
437 if (!EFI_ERROR(Status)) {\r
438 DEBUG((DEBUG_INFO, "TPM_PT_FIRMWARE_VERSION_1 0x%x\n", FirmwareVersion1));\r
439 DEBUG((DEBUG_INFO, "TPM_PT_FIRMWARE_VERSION_2 0x%x\n", FirmwareVersion2));\r
440 //\r
441 // #### is Firmware Version 1\r
442 //\r
443 if (PnpHID) {\r
444 AsciiSPrint(HID + 3, TPM_HID_PNP_SIZE - 3, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 && 0x0000FFFF));\r
445 } else {\r
446 AsciiSPrint(HID + 4, TPM_HID_ACPI_SIZE - 4, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 && 0x0000FFFF));\r
447 }\r
448\r
449 } else {\r
450 DEBUG ((DEBUG_ERROR, "Get TPM_PT_FIRMWARE_VERSION_X failed %x!\n", Status));\r
451 ASSERT(FALSE);\r
452 return Status;\r
453 }\r
454\r
455 return EFI_SUCCESS;\r
456}\r
457\r
1abfa4ce
JY
458/**\r
459 This function processes the results of changes in configuration.\r
460\r
461 @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
462 @param[in] Action Specifies the type of action taken by the browser.\r
463 @param[in] QuestionId A unique value which is sent to the original\r
464 exporting driver so that it can identify the type\r
465 of data to expect.\r
466 @param[in] Type The type of value for the question.\r
467 @param[in] Value A pointer to the data being sent to the original\r
468 exporting driver.\r
469 @param[out] ActionRequest On return, points to the action requested by the\r
470 callback function.\r
471\r
472 @retval EFI_SUCCESS The callback successfully handled the action.\r
473 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
474 variable and its data.\r
475 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
476 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
477 callback.\r
478\r
479**/\r
480EFI_STATUS\r
481EFIAPI\r
482Tcg2Callback (\r
483 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
484 IN EFI_BROWSER_ACTION Action,\r
485 IN EFI_QUESTION_ID QuestionId,\r
486 IN UINT8 Type,\r
487 IN EFI_IFR_TYPE_VALUE *Value,\r
488 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
489 )\r
490{\r
a6e0e994
ZC
491 EFI_STATUS Status;\r
492 EFI_INPUT_KEY Key;\r
493 CHAR8 HidStr[16];\r
494 CHAR16 UnHidStr[16];\r
495 TCG2_CONFIG_PRIVATE_DATA *Private;\r
518b6f65 496\r
1abfa4ce
JY
497 if ((This == NULL) || (Value == NULL) || (ActionRequest == NULL)) {\r
498 return EFI_INVALID_PARAMETER;\r
499 }\r
518b6f65 500\r
a6e0e994
ZC
501 Private = TCG2_CONFIG_PRIVATE_DATA_FROM_THIS (This);\r
502\r
503 if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
504 //\r
505 // Update TPM2 HID info\r
506 //\r
507 if (QuestionId == KEY_TPM_DEVICE) {\r
508 Status = GetTpm2HID(HidStr, 16);\r
509\r
510 if (EFI_ERROR(Status)) {\r
511 //\r
512 // Fail to get TPM2 HID\r
513 //\r
514 HiiSetString (Private->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_HID_CONTENT), L"Unknown", NULL);\r
515 } else {\r
516 AsciiStrToUnicodeStrS(HidStr, UnHidStr, 16);\r
517 HiiSetString (Private->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_HID_CONTENT), UnHidStr, NULL);\r
518 }\r
519 }\r
520 return EFI_SUCCESS;\r
521 }\r
522\r
518b6f65
JY
523 if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
524 if (QuestionId == KEY_TPM_DEVICE_INTERFACE) {\r
525 EFI_STATUS Status;\r
526 Status = SetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress), Value->u8);\r
527 if (EFI_ERROR (Status)) {\r
528 CreatePopUp (\r
529 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
530 &Key,\r
531 L"Error: Fail to set PTP interface!",\r
532 NULL\r
533 );\r
534 return EFI_DEVICE_ERROR;\r
535 }\r
536 }\r
537 }\r
1abfa4ce
JY
538 \r
539 if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
540 if (QuestionId == KEY_TPM_DEVICE) {\r
541 return EFI_SUCCESS;\r
542 }\r
543 if (QuestionId == KEY_TPM2_OPERATION) {\r
544 return SaveTcg2PpRequest (Value->u8);\r
545 }\r
546 if (QuestionId == KEY_TPM2_OPERATION_PARAMETER) {\r
547 return SaveTcg2PpRequestParameter (Value->u32);\r
548 }\r
549 if ((QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) {\r
550 SaveTcg2PCRBanksRequest (QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0, Value->b);\r
551 }\r
552 }\r
553\r
554 return EFI_UNSUPPORTED;\r
555}\r
556\r
557/**\r
558 Append Buffer With TpmAlgHash.\r
559\r
560 @param[in] Buffer Buffer to be appended.\r
561 @param[in] BufferSize Size of buffer.\r
562 @param[in] TpmAlgHash TpmAlgHash.\r
563\r
564**/\r
565VOID\r
566AppendBufferWithTpmAlgHash (\r
567 IN UINT16 *Buffer,\r
568 IN UINTN BufferSize,\r
569 IN UINT32 TpmAlgHash\r
570 )\r
571{\r
572 switch (TpmAlgHash) {\r
573 case TPM_ALG_SHA1:\r
574 if (Buffer[0] != 0) {\r
d2e8af97 575 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 576 }\r
d2e8af97 577 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1");\r
1abfa4ce
JY
578 break;\r
579 case TPM_ALG_SHA256:\r
580 if (Buffer[0] != 0) {\r
d2e8af97 581 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 582 }\r
d2e8af97 583 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256");\r
1abfa4ce
JY
584 break;\r
585 case TPM_ALG_SHA384:\r
586 if (Buffer[0] != 0) {\r
d2e8af97 587 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 588 }\r
d2e8af97 589 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384");\r
1abfa4ce
JY
590 break;\r
591 case TPM_ALG_SHA512:\r
592 if (Buffer[0] != 0) {\r
d2e8af97 593 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 594 }\r
d2e8af97 595 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512");\r
1abfa4ce
JY
596 break;\r
597 case TPM_ALG_SM3_256:\r
598 if (Buffer[0] != 0) {\r
d2e8af97 599 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 600 }\r
d2e8af97 601 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256");\r
1abfa4ce
JY
602 break;\r
603 }\r
604}\r
605\r
606/**\r
607 Fill Buffer With BootHashAlg.\r
608\r
609 @param[in] Buffer Buffer to be filled.\r
610 @param[in] BufferSize Size of buffer.\r
611 @param[in] BootHashAlg BootHashAlg.\r
612\r
613**/\r
614VOID\r
615FillBufferWithBootHashAlg (\r
616 IN UINT16 *Buffer,\r
617 IN UINTN BufferSize,\r
618 IN UINT32 BootHashAlg\r
619 )\r
620{\r
621 Buffer[0] = 0;\r
622 if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA1) != 0) {\r
623 if (Buffer[0] != 0) {\r
d2e8af97 624 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 625 }\r
d2e8af97 626 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1");\r
1abfa4ce
JY
627 }\r
628 if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA256) != 0) {\r
629 if (Buffer[0] != 0) {\r
d2e8af97 630 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 631 }\r
d2e8af97 632 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256");\r
1abfa4ce
JY
633 }\r
634 if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA384) != 0) {\r
635 if (Buffer[0] != 0) {\r
d2e8af97 636 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 637 }\r
d2e8af97 638 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384");\r
1abfa4ce
JY
639 }\r
640 if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA512) != 0) {\r
641 if (Buffer[0] != 0) {\r
d2e8af97 642 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 643 }\r
d2e8af97 644 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512");\r
1abfa4ce
JY
645 }\r
646 if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SM3_256) != 0) {\r
647 if (Buffer[0] != 0) {\r
d2e8af97 648 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 649 }\r
d2e8af97 650 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256");\r
1abfa4ce
JY
651 }\r
652}\r
653\r
c41eeb44
JY
654/**\r
655 Set ConfigInfo according to TpmAlgHash.\r
656\r
657 @param[in,out] Tcg2ConfigInfo TCG2 config info.\r
658 @param[in] TpmAlgHash TpmAlgHash.\r
659\r
660**/\r
661VOID\r
662SetConfigInfo (\r
663 IN OUT TCG2_CONFIGURATION_INFO *Tcg2ConfigInfo,\r
664 IN UINT32 TpmAlgHash\r
665 )\r
666{\r
667 switch (TpmAlgHash) {\r
668 case TPM_ALG_SHA1:\r
669 Tcg2ConfigInfo->Sha1Supported = TRUE;\r
670 break;\r
671 case TPM_ALG_SHA256:\r
672 Tcg2ConfigInfo->Sha256Supported = TRUE;\r
673 break;\r
674 case TPM_ALG_SHA384:\r
675 Tcg2ConfigInfo->Sha384Supported = TRUE;\r
676 break;\r
677 case TPM_ALG_SHA512:\r
678 Tcg2ConfigInfo->Sha512Supported = TRUE;\r
679 break;\r
680 case TPM_ALG_SM3_256:\r
681 Tcg2ConfigInfo->Sm3Supported = TRUE;\r
682 break;\r
683 }\r
684}\r
685\r
1abfa4ce
JY
686/**\r
687 Fill Buffer With TCG2EventLogFormat.\r
688\r
689 @param[in] Buffer Buffer to be filled.\r
690 @param[in] BufferSize Size of buffer.\r
691 @param[in] TCG2EventLogFormat TCG2EventLogFormat.\r
692\r
693**/\r
694VOID\r
695FillBufferWithTCG2EventLogFormat (\r
696 IN UINT16 *Buffer,\r
697 IN UINTN BufferSize,\r
698 IN UINT32 TCG2EventLogFormat\r
699 )\r
700{\r
701 Buffer[0] = 0;\r
702 if ((TCG2EventLogFormat & EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2) != 0) {\r
703 if (Buffer[0] != 0) {\r
d2e8af97 704 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 705 }\r
d2e8af97 706 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"TCG_1_2");\r
1abfa4ce
JY
707 }\r
708 if ((TCG2EventLogFormat & EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) != 0) {\r
709 if (Buffer[0] != 0) {\r
d2e8af97 710 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 711 }\r
d2e8af97 712 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"TCG_2");\r
1abfa4ce
JY
713 }\r
714 if ((TCG2EventLogFormat & (~EFI_TCG2_EVENT_LOG_FORMAT_ALL)) != 0) {\r
715 if (Buffer[0] != 0) {\r
d2e8af97 716 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 717 }\r
d2e8af97 718 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"UNKNOWN");\r
1abfa4ce
JY
719 }\r
720}\r
721\r
1abfa4ce
JY
722/**\r
723 This function publish the TCG2 configuration Form for TPM device.\r
724\r
725 @param[in, out] PrivateData Points to TCG2 configuration private data.\r
726\r
727 @retval EFI_SUCCESS HII Form is installed for this network device.\r
728 @retval EFI_OUT_OF_RESOURCES Not enough resource for HII Form installation.\r
729 @retval Others Other errors as indicated.\r
730\r
731**/\r
732EFI_STATUS\r
733InstallTcg2ConfigForm (\r
734 IN OUT TCG2_CONFIG_PRIVATE_DATA *PrivateData\r
735 )\r
736{\r
737 EFI_STATUS Status;\r
738 EFI_HII_HANDLE HiiHandle;\r
739 EFI_HANDLE DriverHandle;\r
740 EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
741 UINTN Index;\r
742 TPML_PCR_SELECTION Pcrs;\r
743 CHAR16 TempBuffer[1024];\r
c41eeb44 744 TCG2_CONFIGURATION_INFO Tcg2ConfigInfo;\r
518b6f65 745 UINT8 TpmDeviceInterfaceDetected;\r
1abfa4ce
JY
746\r
747 DriverHandle = NULL;\r
748 ConfigAccess = &PrivateData->ConfigAccess;\r
749 Status = gBS->InstallMultipleProtocolInterfaces (\r
750 &DriverHandle,\r
751 &gEfiDevicePathProtocolGuid,\r
752 &mTcg2HiiVendorDevicePath,\r
753 &gEfiHiiConfigAccessProtocolGuid,\r
754 ConfigAccess,\r
755 NULL\r
756 );\r
757 if (EFI_ERROR (Status)) {\r
758 return Status;\r
759 }\r
760\r
761 PrivateData->DriverHandle = DriverHandle;\r
762\r
763 //\r
764 // Publish the HII package list\r
765 //\r
766 HiiHandle = HiiAddPackages (\r
767 &gTcg2ConfigFormSetGuid,\r
768 DriverHandle,\r
769 Tcg2ConfigDxeStrings,\r
770 Tcg2ConfigBin,\r
771 NULL\r
772 );\r
773 if (HiiHandle == NULL) {\r
774 gBS->UninstallMultipleProtocolInterfaces (\r
775 DriverHandle,\r
776 &gEfiDevicePathProtocolGuid,\r
777 &mTcg2HiiVendorDevicePath,\r
778 &gEfiHiiConfigAccessProtocolGuid,\r
779 ConfigAccess,\r
780 NULL\r
781 ); \r
782\r
783 return EFI_OUT_OF_RESOURCES;\r
784 }\r
785 \r
786 PrivateData->HiiHandle = HiiHandle;\r
787\r
788 //\r
789 // Update static data\r
790 //\r
791 switch (PrivateData->TpmDeviceDetected) {\r
792 case TPM_DEVICE_NULL:\r
793 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Not Found", NULL);\r
794 break;\r
795 case TPM_DEVICE_1_2:\r
796 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 1.2", NULL);\r
797 break;\r
798 case TPM_DEVICE_2_0_DTPM:\r
518b6f65 799 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 2.0", NULL);\r
1abfa4ce
JY
800 break;\r
801 default:\r
802 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Unknown", NULL);\r
803 break;\r
804 }\r
805\r
c41eeb44 806 ZeroMem (&Tcg2ConfigInfo, sizeof(Tcg2ConfigInfo));\r
1abfa4ce
JY
807 Status = Tpm2GetCapabilityPcrs (&Pcrs);\r
808 if (EFI_ERROR (Status)) {\r
809 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACTIVE_HASH_ALGO_CONTENT), L"[Unknown]", NULL);\r
810 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_SUPPORTED_HASH_ALGO_CONTENT), L"[Unknown]", NULL);\r
811 } else {\r
812 TempBuffer[0] = 0;\r
813 for (Index = 0; Index < Pcrs.count; Index++) {\r
72388f9c 814 if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
1abfa4ce
JY
815 AppendBufferWithTpmAlgHash (TempBuffer, sizeof(TempBuffer), Pcrs.pcrSelections[Index].hash);\r
816 }\r
817 }\r
818 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACTIVE_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
819\r
820 TempBuffer[0] = 0;\r
821 for (Index = 0; Index < Pcrs.count; Index++) {\r
822 AppendBufferWithTpmAlgHash (TempBuffer, sizeof(TempBuffer), Pcrs.pcrSelections[Index].hash);\r
c41eeb44 823 SetConfigInfo (&Tcg2ConfigInfo, Pcrs.pcrSelections[Index].hash);\r
1abfa4ce
JY
824 }\r
825 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_SUPPORTED_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
826 }\r
827\r
828 FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PcdGet32 (PcdTcg2HashAlgorithmBitmap));\r
829 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_BIOS_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
830\r
831 //\r
832 // Tcg2 Capability\r
833 //\r
834 FillBufferWithTCG2EventLogFormat (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.SupportedEventLogs);\r
835 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_SUPPORTED_EVENT_LOG_FORMAT_CONTENT), TempBuffer, NULL);\r
836\r
837 FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.HashAlgorithmBitmap);\r
838 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_HASH_ALGO_BITMAP_CONTENT), TempBuffer, NULL);\r
839\r
840 UnicodeSPrint (TempBuffer, sizeof (TempBuffer), L"%d", PrivateData->ProtocolCapability.NumberOfPCRBanks);\r
841 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_NUMBER_OF_PCR_BANKS_CONTENT), TempBuffer, NULL);\r
842\r
843 FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.ActivePcrBanks);\r
844 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_ACTIVE_PCR_BANKS_CONTENT), TempBuffer, NULL);\r
845\r
518b6f65
JY
846 //\r
847 // Update TPM device interface type\r
848 //\r
849 if (PrivateData->TpmDeviceDetected == TPM_DEVICE_2_0_DTPM) {\r
850 TpmDeviceInterfaceDetected = GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
851 switch (TpmDeviceInterfaceDetected) {\r
852 case TPM_DEVICE_INTERFACE_TIS:\r
853 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"TIS", NULL);\r
854 break;\r
855 case TPM_DEVICE_INTERFACE_PTP_FIFO:\r
856 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP FIFO", NULL);\r
857 break;\r
858 case TPM_DEVICE_INTERFACE_PTP_CRB:\r
859 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP CRB", NULL);\r
860 break;\r
861 default:\r
862 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"Unknown", NULL);\r
863 break;\r
864 }\r
865\r
866 Tcg2ConfigInfo.TpmDeviceInterfaceAttempt = TpmDeviceInterfaceDetected;\r
867 switch (TpmDeviceInterfaceDetected) {\r
868 case TPM_DEVICE_INTERFACE_TIS:\r
869 Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = FALSE;\r
870 Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported = FALSE;\r
871 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), L"TIS", NULL);\r
872 break;\r
873 case TPM_DEVICE_INTERFACE_PTP_FIFO:\r
874 case TPM_DEVICE_INTERFACE_PTP_CRB:\r
875 Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = IsPtpFifoSupported((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
876 Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported = IsPtpCrbSupported((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
877 TempBuffer[0] = 0;\r
878 if (Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported) {\r
879 if (TempBuffer[0] != 0) {\r
880 StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L", ");\r
881 }\r
882 StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L"PTP FIFO");\r
883 }\r
884 if (Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported) {\r
885 if (TempBuffer[0] != 0) {\r
886 StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L", ");\r
887 }\r
888 StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L"PTP CRB");\r
889 }\r
890 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), TempBuffer, NULL);\r
891 break;\r
892 default:\r
893 Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = FALSE;\r
894 Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported = FALSE;\r
895 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), L"Unknown", NULL);\r
896 break;\r
897 }\r
898 }\r
899\r
c41eeb44
JY
900 //\r
901 // Set ConfigInfo, to control the check box.\r
902 //\r
903 Status = gRT->SetVariable (\r
904 TCG2_STORAGE_INFO_NAME,\r
905 &gTcg2ConfigFormSetGuid,\r
906 EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
907 sizeof(Tcg2ConfigInfo),\r
908 &Tcg2ConfigInfo\r
909 );\r
910 if (EFI_ERROR (Status)) {\r
911 DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_INFO_NAME\n"));\r
912 }\r
1abfa4ce
JY
913 return EFI_SUCCESS; \r
914}\r
915\r
916/**\r
917 This function removes TCG2 configuration Form.\r
918\r
919 @param[in, out] PrivateData Points to TCG2 configuration private data.\r
920\r
921**/\r
922VOID\r
923UninstallTcg2ConfigForm (\r
924 IN OUT TCG2_CONFIG_PRIVATE_DATA *PrivateData\r
925 )\r
926{\r
927 //\r
928 // Uninstall HII package list\r
929 //\r
930 if (PrivateData->HiiHandle != NULL) {\r
931 HiiRemovePackages (PrivateData->HiiHandle);\r
932 PrivateData->HiiHandle = NULL;\r
933 }\r
934\r
935 //\r
936 // Uninstall HII Config Access Protocol\r
937 //\r
938 if (PrivateData->DriverHandle != NULL) {\r
939 gBS->UninstallMultipleProtocolInterfaces (\r
940 PrivateData->DriverHandle,\r
941 &gEfiDevicePathProtocolGuid,\r
942 &mTcg2HiiVendorDevicePath,\r
943 &gEfiHiiConfigAccessProtocolGuid,\r
944 &PrivateData->ConfigAccess,\r
945 NULL\r
946 );\r
947 PrivateData->DriverHandle = NULL;\r
948 }\r
949 \r
950 FreePool (PrivateData);\r
951}\r