X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=SecurityPkg%2FTcg%2FTcgConfigDxe%2FTcgConfigImpl.c;h=52ea1ac3aeaf1ada0ed22664787078e9cee5c4d6;hb=HEAD;hp=c172583441d6e7e5b6144863b76f44fa2d0a5741;hpb=a0c56a8219ec268d8ac4e051035f1636545cc478;p=mirror_edk2.git diff --git a/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c b/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c index c172583441..52ea1ac3ae 100644 --- a/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c +++ b/SecurityPkg/Tcg/TcgConfigDxe/TcgConfigImpl.c @@ -1,22 +1,16 @@ /** @file HII Config Access protocol implementation of TCG configuration module. -Copyright (c) 2011, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "TcgConfigImpl.h" -CHAR16 mTcgStorageName[] = L"TCG_CONFIGURATION"; +CHAR16 mTcgStorageName[] = L"TCG_CONFIGURATION"; -TCG_CONFIG_PRIVATE_DATA mTcgConfigPrivateDateTemplate = { +TCG_CONFIG_PRIVATE_DATA mTcgConfigPrivateDateTemplate = { TCG_CONFIG_PRIVATE_DATA_SIGNATURE, { TcgExtractConfig, @@ -25,14 +19,14 @@ TCG_CONFIG_PRIVATE_DATA mTcgConfigPrivateDateTemplate = { } }; -HII_VENDOR_DEVICE_PATH mTcgHiiVendorDevicePath = { +HII_VENDOR_DEVICE_PATH mTcgHiiVendorDevicePath = { { { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { - (UINT8) (sizeof (VENDOR_DEVICE_PATH)), - (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) + (UINT8)(sizeof (VENDOR_DEVICE_PATH)), + (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8) } }, TCG_CONFIG_FORM_SET_GUID @@ -40,9 +34,9 @@ HII_VENDOR_DEVICE_PATH mTcgHiiVendorDevicePath = { { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, - { - (UINT8) (END_DEVICE_PATH_LENGTH), - (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) + { + (UINT8)(END_DEVICE_PATH_LENGTH), + (UINT8)((END_DEVICE_PATH_LENGTH) >> 8) } } }; @@ -61,31 +55,31 @@ HII_VENDOR_DEVICE_PATH mTcgHiiVendorDevicePath = { **/ EFI_STATUS GetTpmState ( - IN EFI_TCG_PROTOCOL *TcgProtocol, - OUT BOOLEAN *TpmEnable, OPTIONAL - OUT BOOLEAN *TpmActivate OPTIONAL + IN EFI_TCG_PROTOCOL *TcgProtocol, + OUT BOOLEAN *TpmEnable OPTIONAL, + OUT BOOLEAN *TpmActivate OPTIONAL ) { - EFI_STATUS Status; - TPM_RSP_COMMAND_HDR *TpmRsp; - UINT32 TpmSendSize; - TPM_PERMANENT_FLAGS *TpmPermanentFlags; - UINT8 CmdBuf[64]; + EFI_STATUS Status; + TPM_RSP_COMMAND_HDR *TpmRsp; + UINT32 TpmSendSize; + TPM_PERMANENT_FLAGS *TpmPermanentFlags; + UINT8 CmdBuf[64]; ASSERT (TcgProtocol != NULL); - + // // Get TPM Permanent flags (TpmEnable, TpmActivate) // if ((TpmEnable != NULL) || (TpmActivate != NULL)) { TpmSendSize = sizeof (TPM_RQU_COMMAND_HDR) + sizeof (UINT32) * 3; - *(UINT16*)&CmdBuf[0] = H2NS (TPM_TAG_RQU_COMMAND); - *(UINT32*)&CmdBuf[2] = H2NL (TpmSendSize); - *(UINT32*)&CmdBuf[6] = H2NL (TPM_ORD_GetCapability); - - *(UINT32*)&CmdBuf[10] = H2NL (TPM_CAP_FLAG); - *(UINT32*)&CmdBuf[14] = H2NL (sizeof (TPM_CAP_FLAG_PERMANENT)); - *(UINT32*)&CmdBuf[18] = H2NL (TPM_CAP_FLAG_PERMANENT); + *(UINT16 *)&CmdBuf[0] = SwapBytes16 (TPM_TAG_RQU_COMMAND); + *(UINT32 *)&CmdBuf[2] = SwapBytes32 (TpmSendSize); + *(UINT32 *)&CmdBuf[6] = SwapBytes32 (TPM_ORD_GetCapability); + + *(UINT32 *)&CmdBuf[10] = SwapBytes32 (TPM_CAP_FLAG); + *(UINT32 *)&CmdBuf[14] = SwapBytes32 (sizeof (TPM_CAP_FLAG_PERMANENT)); + *(UINT32 *)&CmdBuf[18] = SwapBytes32 (TPM_CAP_FLAG_PERMANENT); Status = TcgProtocol->PassThroughToTpm ( TcgProtocol, @@ -93,13 +87,13 @@ GetTpmState ( CmdBuf, sizeof (CmdBuf), CmdBuf - ); - TpmRsp = (TPM_RSP_COMMAND_HDR *) &CmdBuf[0]; - if (EFI_ERROR (Status) || (TpmRsp->tag != H2NS (TPM_TAG_RSP_COMMAND)) || (TpmRsp->returnCode != 0)) { + ); + TpmRsp = (TPM_RSP_COMMAND_HDR *)&CmdBuf[0]; + if (EFI_ERROR (Status) || (TpmRsp->tag != SwapBytes16 (TPM_TAG_RSP_COMMAND)) || (TpmRsp->returnCode != 0)) { return EFI_DEVICE_ERROR; } - - TpmPermanentFlags = (TPM_PERMANENT_FLAGS *) &CmdBuf[sizeof (TPM_RSP_COMMAND_HDR) + sizeof (UINT32)]; + + TpmPermanentFlags = (TPM_PERMANENT_FLAGS *)&CmdBuf[sizeof (TPM_RSP_COMMAND_HDR) + sizeof (UINT32)]; if (TpmEnable != NULL) { *TpmEnable = (BOOLEAN) !TpmPermanentFlags->disable; @@ -109,8 +103,8 @@ GetTpmState ( *TpmActivate = (BOOLEAN) !TpmPermanentFlags->deactivated; } } - - return EFI_SUCCESS; + + return EFI_SUCCESS; } /** @@ -142,25 +136,22 @@ GetTpmState ( EFI_STATUS EFIAPI TcgExtractConfig ( - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - IN CONST EFI_STRING Request, - OUT EFI_STRING *Progress, - OUT EFI_STRING *Results + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN CONST EFI_STRING Request, + OUT EFI_STRING *Progress, + OUT EFI_STRING *Results ) { - EFI_STATUS Status; - UINTN BufferSize; - TCG_CONFIGURATION Configuration; - TCG_CONFIG_PRIVATE_DATA *PrivateData; - EFI_STRING ConfigRequestHdr; - EFI_STRING ConfigRequest; - BOOLEAN AllocatedRequest; - UINTN Size; - BOOLEAN TpmEnable; - BOOLEAN TpmActivate; - CHAR16 State[32]; - - if (Progress == NULL || Results == NULL) { + EFI_STATUS Status; + TCG_CONFIG_PRIVATE_DATA *PrivateData; + EFI_STRING ConfigRequestHdr; + EFI_STRING ConfigRequest; + BOOLEAN AllocatedRequest; + UINTN Size; + BOOLEAN TpmEnable; + BOOLEAN TpmActivate; + + if ((Progress == NULL) || (Results == NULL)) { return EFI_INVALID_PARAMETER; } @@ -178,19 +169,11 @@ TcgExtractConfig ( // // Convert buffer data to by helper function BlockToConfig() - // - ZeroMem (&Configuration, sizeof (TCG_CONFIGURATION)); - - Configuration.MorState = PcdGetBool (PcdMorEnable); - Configuration.TpmOperation = ENABLE; - Configuration.HideTpm = (BOOLEAN) (PcdGetBool (PcdHideTpmSupport) && PcdGetBool (PcdHideTpm)); - // - // Read the original value of HideTpm from PrivateData which won't be changed by Setup in this boot. // - Configuration.OriginalHideTpm = PrivateData->HideTpm; + PrivateData->Configuration->TpmOperation = PHYSICAL_PRESENCE_NO_ACTION; // - // Display current TPM state. + // Get current TPM state. // if (PrivateData->TcgProtocol != NULL) { Status = GetTpmState (PrivateData->TcgProtocol, &TpmEnable, &TpmActivate); @@ -198,20 +181,10 @@ TcgExtractConfig ( return Status; } - UnicodeSPrint ( - State, - sizeof (State), - L"%s, and %s", - TpmEnable ? L"Enabled" : L"Disabled", - TpmActivate ? L"Activated" : L"Deactivated" - ); - Configuration.TpmEnable = TpmEnable; - Configuration.TpmActivate = TpmActivate; - - HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM_STATE_CONTENT), State, NULL); + PrivateData->Configuration->TpmEnable = TpmEnable; + PrivateData->Configuration->TpmActivate = TpmActivate; } - BufferSize = sizeof (Configuration); ConfigRequest = Request; if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) { // @@ -220,19 +193,19 @@ TcgExtractConfig ( // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator // ConfigRequestHdr = HiiConstructConfigHdr (&gTcgConfigFormSetGuid, mTcgStorageName, PrivateData->DriverHandle); - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); + Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); + ConfigRequest = AllocateZeroPool (Size); ASSERT (ConfigRequest != NULL); AllocatedRequest = TRUE; - UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64) BufferSize); + UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, sizeof (TCG_CONFIGURATION)); FreePool (ConfigRequestHdr); } Status = gHiiConfigRouting->BlockToConfig ( gHiiConfigRouting, ConfigRequest, - (UINT8 *) &Configuration, - BufferSize, + (UINT8 *)PrivateData->Configuration, + sizeof (TCG_CONFIGURATION), Results, Progress ); @@ -242,6 +215,7 @@ TcgExtractConfig ( if (AllocatedRequest) { FreePool (ConfigRequest); } + // // Set Progress string to the original request string. // @@ -275,16 +249,16 @@ TcgExtractConfig ( EFI_STATUS EFIAPI TcgRouteConfig ( - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - IN CONST EFI_STRING Configuration, - OUT EFI_STRING *Progress + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN CONST EFI_STRING Configuration, + OUT EFI_STRING *Progress ) { - EFI_STATUS Status; - UINTN BufferSize; - TCG_CONFIGURATION TcgConfiguration; + EFI_STATUS Status; + UINTN BufferSize; + TCG_CONFIGURATION TcgConfiguration; - if (Configuration == NULL || Progress == NULL) { + if ((Configuration == NULL) || (Progress == NULL)) { return EFI_INVALID_PARAMETER; } @@ -297,20 +271,17 @@ TcgRouteConfig ( // Convert to buffer data by helper function ConfigToBlock() // BufferSize = sizeof (TCG_CONFIGURATION); - Status = gHiiConfigRouting->ConfigToBlock ( - gHiiConfigRouting, - Configuration, - (UINT8 *) &TcgConfiguration, - &BufferSize, - Progress - ); + Status = gHiiConfigRouting->ConfigToBlock ( + gHiiConfigRouting, + Configuration, + (UINT8 *)&TcgConfiguration, + &BufferSize, + Progress + ); if (EFI_ERROR (Status)) { return Status; } - PcdSetBool (PcdMorEnable, TcgConfiguration.MorState); - PcdSetBool (PcdHideTpm, TcgConfiguration.HideTpm); - return EFI_SUCCESS; } @@ -325,45 +296,40 @@ TcgRouteConfig ( **/ EFI_STATUS SavePpRequest ( - IN UINT8 PpRequest + IN UINT8 PpRequest ) { - EFI_STATUS Status; - UINTN DataSize; - EFI_PHYSICAL_PRESENCE PpData; + EFI_STATUS Status; + UINTN DataSize; + EFI_PHYSICAL_PRESENCE PpData; // // Save TPM command to variable. // DataSize = sizeof (EFI_PHYSICAL_PRESENCE); - Status = gRT->GetVariable ( - PHYSICAL_PRESENCE_VARIABLE, - &gEfiPhysicalPresenceGuid, - NULL, - &DataSize, - &PpData - ); + Status = gRT->GetVariable ( + PHYSICAL_PRESENCE_VARIABLE, + &gEfiPhysicalPresenceGuid, + NULL, + &DataSize, + &PpData + ); if (EFI_ERROR (Status)) { return Status; - } - + } + PpData.PPRequest = PpRequest; - Status = gRT->SetVariable ( - PHYSICAL_PRESENCE_VARIABLE, - &gEfiPhysicalPresenceGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - DataSize, - &PpData - ); - if (EFI_ERROR(Status)) { + Status = gRT->SetVariable ( + PHYSICAL_PRESENCE_VARIABLE, + &gEfiPhysicalPresenceGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + DataSize, + &PpData + ); + if (EFI_ERROR (Status)) { return Status; } - // - // Reset system. - // - gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); - return EFI_SUCCESS; } @@ -392,24 +358,43 @@ SavePpRequest ( EFI_STATUS EFIAPI TcgCallback ( - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - IN EFI_BROWSER_ACTION Action, - IN EFI_QUESTION_ID QuestionId, - IN UINT8 Type, - IN EFI_IFR_TYPE_VALUE *Value, - OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest + IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, + IN EFI_BROWSER_ACTION Action, + IN EFI_QUESTION_ID QuestionId, + IN UINT8 Type, + IN EFI_IFR_TYPE_VALUE *Value, + OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest ) { + TCG_CONFIG_PRIVATE_DATA *PrivateData; + CHAR16 State[32]; + if ((This == NULL) || (Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; } - if ((Action != EFI_BROWSER_ACTION_CHANGING) || (QuestionId != KEY_TPM_ACTION)) { + if (Action == EFI_BROWSER_ACTION_FORM_OPEN) { + if (QuestionId == KEY_TPM_ACTION) { + PrivateData = TCG_CONFIG_PRIVATE_DATA_FROM_THIS (This); + UnicodeSPrint ( + State, + sizeof (State), + L"%s, and %s", + PrivateData->Configuration->TpmEnable ? L"Enabled" : L"Disabled", + PrivateData->Configuration->TpmActivate ? L"Activated" : L"Deactivated" + ); + HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM_STATE_CONTENT), State, NULL); + } + + return EFI_SUCCESS; + } + + if ((Action != EFI_BROWSER_ACTION_CHANGED) || (QuestionId != KEY_TPM_ACTION)) { return EFI_UNSUPPORTED; } SavePpRequest (Value->u8); - ASSERT (FALSE); + *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT; return EFI_SUCCESS; } @@ -432,23 +417,18 @@ InstallTcgConfigForm ( EFI_STATUS Status; EFI_HII_HANDLE HiiHandle; EFI_HANDLE DriverHandle; - VOID *StartOpCodeHandle; - VOID *EndOpCodeHandle; - EFI_IFR_GUID_LABEL *StartLabel; - EFI_IFR_GUID_LABEL *EndLabel; - EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess; DriverHandle = NULL; ConfigAccess = &PrivateData->ConfigAccess; - Status = gBS->InstallMultipleProtocolInterfaces ( - &DriverHandle, - &gEfiDevicePathProtocolGuid, - &mTcgHiiVendorDevicePath, - &gEfiHiiConfigAccessProtocolGuid, - ConfigAccess, - NULL - ); + Status = gBS->InstallMultipleProtocolInterfaces ( + &DriverHandle, + &gEfiDevicePathProtocolGuid, + &mTcgHiiVendorDevicePath, + &gEfiHiiConfigAccessProtocolGuid, + ConfigAccess, + NULL + ); if (EFI_ERROR (Status)) { return Status; } @@ -473,47 +453,14 @@ InstallTcgConfigForm ( &gEfiHiiConfigAccessProtocolGuid, ConfigAccess, NULL - ); + ); return EFI_OUT_OF_RESOURCES; } - - PrivateData->HiiHandle = HiiHandle; - - // - // Remove the Hide TPM question from the IFR - // - if (!PcdGetBool (PcdHideTpmSupport)) { - // - // Allocate space for creation of UpdateData Buffer - // - StartOpCodeHandle = HiiAllocateOpCodeHandle (); - ASSERT (StartOpCodeHandle != NULL); - - EndOpCodeHandle = HiiAllocateOpCodeHandle (); - ASSERT (EndOpCodeHandle != NULL); - // - // Create Hii Extend Label OpCode as the start opcode - // - StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); - StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; - StartLabel->Number = LABEL_TCG_CONFIGURATION_HIDETPM; - - // - // Create Hii Extend Label OpCode as the end opcode - // - EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); - EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; - EndLabel->Number = LABEL_END; - - HiiUpdateForm (HiiHandle, NULL, TCG_CONFIGURATION_FORM_ID, StartOpCodeHandle, EndOpCodeHandle); - - HiiFreeOpCodeHandle (StartOpCodeHandle); - HiiFreeOpCodeHandle (EndOpCodeHandle); - } + PrivateData->HiiHandle = HiiHandle; - return EFI_SUCCESS; + return EFI_SUCCESS; } /** @@ -524,7 +471,7 @@ InstallTcgConfigForm ( **/ VOID UninstallTcgConfigForm ( - IN OUT TCG_CONFIG_PRIVATE_DATA *PrivateData + IN OUT TCG_CONFIG_PRIVATE_DATA *PrivateData ) { // @@ -549,6 +496,10 @@ UninstallTcgConfigForm ( ); PrivateData->DriverHandle = NULL; } - + + if (PrivateData->Configuration != NULL) { + FreePool (PrivateData->Configuration); + } + FreePool (PrivateData); }