X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=SecurityPkg%2FTcg%2FTcg2Config%2FTcg2ConfigDriver.c;h=10d1c5cc78004aec40393ee701b42c17b19b1053;hp=881368345b82981c7b304ca2734ce232f1ff1659;hb=HEAD;hpb=1abfa4ce4835639c66ae82cc0d72cffcf3f28b6b diff --git a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c index 881368345b..edf5f0fc77 100644 --- a/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c +++ b/SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c @@ -1,14 +1,8 @@ /** @file The module entry point for Tcg2 configuration module. -Copyright (c) 2015, 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) 2015 - 2018, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -26,38 +20,222 @@ extern TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1]; **/ VOID UpdateDefaultPCRBanks ( - IN VOID *HiiPackage, - IN UINTN HiiPackageSize, - IN UINT32 PCRBanks + IN VOID *HiiPackage, + IN UINTN HiiPackageSize, + IN UINT32 PCRBanks ) { - EFI_HII_PACKAGE_HEADER *HiiPackageHeader; - EFI_IFR_OP_HEADER *IfrOpCodeHeader; - EFI_IFR_CHECKBOX *IfrCheckBox; - EFI_IFR_DEFAULT *IfrDefault; + EFI_HII_PACKAGE_HEADER *HiiPackageHeader; + EFI_IFR_OP_HEADER *IfrOpCodeHeader; + EFI_IFR_CHECKBOX *IfrCheckBox; + EFI_IFR_DEFAULT *IfrDefault; HiiPackageHeader = (EFI_HII_PACKAGE_HEADER *)HiiPackage; switch (HiiPackageHeader->Type) { - case EFI_HII_PACKAGE_FORMS: - IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)(HiiPackageHeader + 1); - while ((UINTN)IfrOpCodeHeader < (UINTN)HiiPackageHeader + HiiPackageHeader->Length) { - switch (IfrOpCodeHeader->OpCode) { - case EFI_IFR_CHECKBOX_OP: - IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpCodeHeader; - if ((IfrCheckBox->Question.QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (IfrCheckBox->Question.QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) { - IfrDefault = (EFI_IFR_DEFAULT *)(IfrCheckBox + 1); - ASSERT (IfrDefault->Header.OpCode == EFI_IFR_DEFAULT_OP); - ASSERT (IfrDefault->Type == EFI_IFR_TYPE_BOOLEAN); - IfrDefault->Value.b = (BOOLEAN)((PCRBanks >> (IfrCheckBox->Question.QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0)) & 0x1); + case EFI_HII_PACKAGE_FORMS: + IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)(HiiPackageHeader + 1); + while ((UINTN)IfrOpCodeHeader < (UINTN)HiiPackageHeader + HiiPackageHeader->Length) { + switch (IfrOpCodeHeader->OpCode) { + case EFI_IFR_CHECKBOX_OP: + IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpCodeHeader; + if ((IfrCheckBox->Question.QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (IfrCheckBox->Question.QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) { + IfrDefault = (EFI_IFR_DEFAULT *)(IfrCheckBox + 1); + ASSERT (IfrDefault->Header.OpCode == EFI_IFR_DEFAULT_OP); + ASSERT (IfrDefault->Type == EFI_IFR_TYPE_BOOLEAN); + IfrDefault->Value.b = (BOOLEAN)((PCRBanks >> (IfrCheckBox->Question.QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0)) & 0x1); + } + + break; } - break; + + IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)((UINTN)IfrOpCodeHeader + IfrOpCodeHeader->Length); + } + + break; + } + + return; +} + +/** + Initialize TCG2 version information. + + This function will initialize efi varstore configuration data for + TCG2_VERSION_NAME variable, check the value of related PCD with + the variable value and set string for the version state content + according to the PCD value. + + @param[in] PrivateData Points to TCG2 configuration private data. + +**/ +VOID +InitializeTcg2VersionInfo ( + IN TCG2_CONFIG_PRIVATE_DATA *PrivateData + ) +{ + EFI_STATUS Status; + EFI_STRING ConfigRequestHdr; + BOOLEAN ActionFlag; + TCG2_VERSION Tcg2Version; + UINTN DataSize; + UINT64 PcdTcg2PpiVersion; + UINT8 PcdTpm2AcpiTableRev; + + // + // Get the PCD value before initializing efi varstore configuration data. + // + PcdTcg2PpiVersion = 0; + CopyMem ( + &PcdTcg2PpiVersion, + PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer), + AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer)) + ); + + PcdTpm2AcpiTableRev = PcdGet8 (PcdTpm2AcpiTableRev); + + // + // Initialize efi varstore configuration data. + // + ZeroMem (&Tcg2Version, sizeof (Tcg2Version)); + ConfigRequestHdr = HiiConstructConfigHdr ( + &gTcg2ConfigFormSetGuid, + TCG2_VERSION_NAME, + PrivateData->DriverHandle + ); + ASSERT (ConfigRequestHdr != NULL); + DataSize = sizeof (Tcg2Version); + Status = gRT->GetVariable ( + TCG2_VERSION_NAME, + &gTcg2ConfigFormSetGuid, + NULL, + &DataSize, + &Tcg2Version + ); + if (!EFI_ERROR (Status)) { + // + // EFI variable does exist and validate current setting. + // + ActionFlag = HiiValidateSettings (ConfigRequestHdr); + if (!ActionFlag) { + // + // Current configuration is invalid, reset to defaults. + // + ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD); + ASSERT (ActionFlag); + // + // Get the default values from variable. + // + DataSize = sizeof (Tcg2Version); + Status = gRT->GetVariable ( + TCG2_VERSION_NAME, + &gTcg2ConfigFormSetGuid, + NULL, + &DataSize, + &Tcg2Version + ); + ASSERT_EFI_ERROR (Status); + } + } else { + // + // EFI variable doesn't exist or variable size is not expected. + // + + // + // Store zero data Buffer Storage to EFI variable. + // + Status = gRT->SetVariable ( + TCG2_VERSION_NAME, + &gTcg2ConfigFormSetGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof (Tcg2Version), + &Tcg2Version + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_VERSION_NAME\n")); + return; + } else { + // + // Build this variable based on default values stored in IFR. + // + ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD); + ASSERT (ActionFlag); + // + // Get the default values from variable. + // + DataSize = sizeof (Tcg2Version); + Status = gRT->GetVariable ( + TCG2_VERSION_NAME, + &gTcg2ConfigFormSetGuid, + NULL, + &DataSize, + &Tcg2Version + ); + ASSERT_EFI_ERROR (Status); + if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) { + DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer default value is not same with the default value in VFR\n")); + DEBUG ((DEBUG_WARN, "WARNING: The default value in VFR has be chosen\n")); + } + + if (PcdTpm2AcpiTableRev != Tcg2Version.Tpm2AcpiTableRev) { + DEBUG ((DEBUG_WARN, "WARNING: PcdTpm2AcpiTableRev default value is not same with the default value in VFR\n")); + DEBUG ((DEBUG_WARN, "WARNING: The default value in VFR has be chosen\n")); } - IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)((UINTN)IfrOpCodeHeader + IfrOpCodeHeader->Length); } - break; } - return ; + + FreePool (ConfigRequestHdr); + + // + // Get the PCD value again. + // If the PCD value is not equal to the value in variable, + // the PCD is not DynamicHii type and does not map to the setup option. + // + PcdTcg2PpiVersion = 0; + CopyMem ( + &PcdTcg2PpiVersion, + PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer), + AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer)) + ); + if (PcdTcg2PpiVersion != Tcg2Version.PpiVersion) { + DEBUG ((DEBUG_WARN, "WARNING: PcdTcgPhysicalPresenceInterfaceVer is not DynamicHii type and does not map to TCG2_VERSION.PpiVersion\n")); + DEBUG ((DEBUG_WARN, "WARNING: The TCG2 PPI version configuring from setup page will not work\n")); + } + + switch (PcdTcg2PpiVersion) { + case TCG2_PPI_VERSION_1_2: + HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_PPI_VERSION_STATE_CONTENT), L"1.2", NULL); + break; + case TCG2_PPI_VERSION_1_3: + HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_PPI_VERSION_STATE_CONTENT), L"1.3", NULL); + break; + default: + ASSERT (FALSE); + break; + } + + // + // Get the PcdTpm2AcpiTableRev value again. + // If the PCD value is not equal to the value in variable, + // the PCD is not DynamicHii type and does not map to TCG2_VERSION Variable. + // + PcdTpm2AcpiTableRev = PcdGet8 (PcdTpm2AcpiTableRev); + if (PcdTpm2AcpiTableRev != Tcg2Version.Tpm2AcpiTableRev) { + DEBUG ((DEBUG_WARN, "WARNING: PcdTpm2AcpiTableRev is not DynamicHii type and does not map to TCG2_VERSION.Tpm2AcpiTableRev\n")); + DEBUG ((DEBUG_WARN, "WARNING: The Tpm2 ACPI Revision configuring from setup page will not work\n")); + } + + switch (PcdTpm2AcpiTableRev) { + case EFI_TPM2_ACPI_TABLE_REVISION_3: + HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_REVISION_STATE_CONTENT), L"Rev 3", NULL); + break; + case EFI_TPM2_ACPI_TABLE_REVISION_4: + HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_REVISION_STATE_CONTENT), L"Rev 4", NULL); + break; + default: + ASSERT (FALSE); + break; + } } /** @@ -68,15 +246,15 @@ UpdateDefaultPCRBanks ( @retval EFI_ALREADY_STARTED The driver already exists in system. @retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources. - @retval EFI_SUCCES All the related protocols are installed on the driver. + @retval EFI_SUCCESS All the related protocols are installed on the driver. @retval Others Fail to install protocols as indicated. **/ EFI_STATUS EFIAPI Tcg2ConfigDriverEntryPoint ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; @@ -99,7 +277,7 @@ Tcg2ConfigDriverEntryPoint ( if (!EFI_ERROR (Status)) { return EFI_ALREADY_STARTED; } - + // // Create a private data structure. // @@ -108,7 +286,7 @@ Tcg2ConfigDriverEntryPoint ( mTcg2ConfigPrivateDate = PrivateData; // // Install private GUID. - // + // Status = gBS->InstallMultipleProtocolInterfaces ( &ImageHandle, &gEfiCallerIdGuid, @@ -117,36 +295,36 @@ Tcg2ConfigDriverEntryPoint ( ); ASSERT_EFI_ERROR (Status); - Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) &PrivateData->Tcg2Protocol); + Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **)&PrivateData->Tcg2Protocol); ASSERT_EFI_ERROR (Status); - PrivateData->ProtocolCapability.Size = sizeof(PrivateData->ProtocolCapability); - Status = PrivateData->Tcg2Protocol->GetCapability ( - PrivateData->Tcg2Protocol, - &PrivateData->ProtocolCapability - ); + PrivateData->ProtocolCapability.Size = sizeof (PrivateData->ProtocolCapability); + Status = PrivateData->Tcg2Protocol->GetCapability ( + PrivateData->Tcg2Protocol, + &PrivateData->ProtocolCapability + ); ASSERT_EFI_ERROR (Status); - DataSize = sizeof(Tcg2Configuration); - Status = gRT->GetVariable ( - TCG2_STORAGE_NAME, - &gTcg2ConfigFormSetGuid, - NULL, - &DataSize, - &Tcg2Configuration - ); + DataSize = sizeof (Tcg2Configuration); + Status = gRT->GetVariable ( + TCG2_STORAGE_NAME, + &gTcg2ConfigFormSetGuid, + NULL, + &DataSize, + &Tcg2Configuration + ); if (EFI_ERROR (Status)) { // // Variable not ready, set default value // - Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT; + Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT; } // // Validation // if ((Tcg2Configuration.TpmDevice > TPM_DEVICE_MAX) || (Tcg2Configuration.TpmDevice < TPM_DEVICE_MIN)) { - Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT; + Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT; } // @@ -156,34 +334,21 @@ Tcg2ConfigDriverEntryPoint ( Status = PrivateData->Tcg2Protocol->GetActivePcrBanks (PrivateData->Tcg2Protocol, &CurrentActivePCRBanks); ASSERT_EFI_ERROR (Status); PrivateData->PCRBanksDesired = CurrentActivePCRBanks; - UpdateDefaultPCRBanks (Tcg2ConfigBin + sizeof(UINT32), ReadUnaligned32((UINT32 *)Tcg2ConfigBin) - sizeof(UINT32), CurrentActivePCRBanks); - - // - // Save to variable so platform driver can get it. - // - Status = gRT->SetVariable ( - TCG2_STORAGE_NAME, - &gTcg2ConfigFormSetGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, - sizeof(Tcg2Configuration), - &Tcg2Configuration - ); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n")); - } + UpdateDefaultPCRBanks (Tcg2ConfigBin + sizeof (UINT32), ReadUnaligned32 ((UINT32 *)Tcg2ConfigBin) - sizeof (UINT32), CurrentActivePCRBanks); // // Sync data from PCD to variable, so that we do not need detect again in S3 phase. // Tcg2DeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL; - for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) { - if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) { + for (Index = 0; Index < sizeof (mTpmInstanceId)/sizeof (mTpmInstanceId[0]); Index++) { + if (CompareGuid (PcdGetPtr (PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) { Tcg2DeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice; break; } } PrivateData->TpmDeviceDetected = Tcg2DeviceDetection.TpmDeviceDetected; + Tcg2Configuration.TpmDevice = Tcg2DeviceDetection.TpmDeviceDetected; // // Save to variable so platform driver can get it. @@ -192,11 +357,11 @@ Tcg2ConfigDriverEntryPoint ( TCG2_DEVICE_DETECTION_NAME, &gTcg2ConfigFormSetGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, - sizeof(Tcg2DeviceDetection), + sizeof (Tcg2DeviceDetection), &Tcg2DeviceDetection ); if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_DEVICE_DETECTION_NAME\n")); + DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_DEVICE_DETECTION_NAME\n")); Status = gRT->SetVariable ( TCG2_DEVICE_DETECTION_NAME, &gTcg2ConfigFormSetGuid, @@ -207,6 +372,20 @@ Tcg2ConfigDriverEntryPoint ( ASSERT_EFI_ERROR (Status); } + // + // Save to variable so platform driver can get it. + // + Status = gRT->SetVariable ( + TCG2_STORAGE_NAME, + &gTcg2ConfigFormSetGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, + sizeof (Tcg2Configuration), + &Tcg2Configuration + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n")); + } + // // We should lock Tcg2DeviceDetection, because it contains information needed at S3. // @@ -219,7 +398,7 @@ Tcg2ConfigDriverEntryPoint ( ); ASSERT_EFI_ERROR (Status); } - + // // Install Tcg2 configuration form // @@ -228,13 +407,15 @@ Tcg2ConfigDriverEntryPoint ( goto ErrorExit; } + InitializeTcg2VersionInfo (PrivateData); + return EFI_SUCCESS; ErrorExit: if (PrivateData != NULL) { UninstallTcg2ConfigForm (PrivateData); - } - + } + return Status; } @@ -253,27 +434,27 @@ Tcg2ConfigDriverUnload ( IN EFI_HANDLE ImageHandle ) { - EFI_STATUS Status; - TCG2_CONFIG_PRIVATE_DATA *PrivateData; + EFI_STATUS Status; + TCG2_CONFIG_PRIVATE_DATA *PrivateData; Status = gBS->HandleProtocol ( ImageHandle, &gEfiCallerIdGuid, - (VOID **) &PrivateData - ); + (VOID **)&PrivateData + ); if (EFI_ERROR (Status)) { - return Status; + return Status; } - + ASSERT (PrivateData->Signature == TCG2_CONFIG_PRIVATE_DATA_SIGNATURE); gBS->UninstallMultipleProtocolInterfaces ( - &ImageHandle, + ImageHandle, &gEfiCallerIdGuid, PrivateData, NULL ); - + UninstallTcg2ConfigForm (PrivateData); return EFI_SUCCESS;