X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=SecurityPkg%2FVariableAuthenticated%2FSecureBootConfigDxe%2FSecureBootConfigImpl.c;h=4ec0f8d13a92a9d68bab170412a32488406ab5d9;hp=acb0dc055892bb6e3a81d2fc086d30e0a079e014;hb=c3cb333e097036764afe240b179056ab8e320071;hpb=65c77f02104cf0cf7bd224df3a5fc08795df9aad diff --git a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c index acb0dc0558..4ec0f8d13a 100644 --- a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c +++ b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c @@ -3145,6 +3145,9 @@ DeleteSignatureEx ( if (DelType == Delete_Signature_List_All) { VariableDataSize = 0; } else { + // + // Traverse to target EFI_SIGNATURE_LIST but others will be skipped. + // while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) { CopyMem ((UINT8 *)NewVariableData + Offset, ListWalker, ListWalker->SignatureListSize); Offset += ListWalker->SignatureListSize; @@ -3154,15 +3157,17 @@ DeleteSignatureEx ( ListIndex++; } - if (CheckedCount == SIGNATURE_DATA_COUNTS (ListWalker) || DelType == Delete_Signature_List_One) { - RemainingSize -= ListWalker->SignatureListSize; - ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize); - } else { + // + // Handle the target EFI_SIGNATURE_LIST. + // If CheckedCount == SIGNATURE_DATA_COUNTS (ListWalker) or DelType == Delete_Signature_List_One + // it means delete the whole EFI_SIGNATURE_LIST, So we just skip this EFI_SIGNATURE_LIST. + // + if (CheckedCount < SIGNATURE_DATA_COUNTS (ListWalker) && DelType == Delete_Signature_Data) { NewCertList = (EFI_SIGNATURE_LIST *)(NewVariableData + Offset); // // Copy header. // - CopyMem ((UINT8 *)NewVariableData, ListWalker, sizeof (EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize); + CopyMem ((UINT8 *)NewVariableData + Offset, ListWalker, sizeof (EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize); Offset += sizeof (EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize; DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)ListWalker + sizeof(EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize); @@ -3181,10 +3186,11 @@ DeleteSignatureEx ( } DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)DataWalker + ListWalker->SignatureSize); } - - RemainingSize -= ListWalker->SignatureListSize; } + RemainingSize -= ListWalker->SignatureListSize; + ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize); + // // Copy remaining data, maybe 0. // @@ -3572,6 +3578,9 @@ LoadSignatureList ( { EFI_STATUS Status; EFI_STRING_ID ListType; + EFI_STRING FormatNameString; + EFI_STRING FormatHelpString; + EFI_STRING FormatTypeString; EFI_SIGNATURE_LIST *ListWalker; EFI_IFR_GUID_LABEL *StartLabel; EFI_IFR_GUID_LABEL *EndLabel; @@ -3591,6 +3600,8 @@ LoadSignatureList ( CHAR16 HelpBuffer[BUFFER_MAX_SIZE]; Status = EFI_SUCCESS; + FormatNameString = NULL; + FormatHelpString = NULL; StartOpCodeHandle = NULL; EndOpCodeHandle = NULL; StartGotoHandle = NULL; @@ -3705,6 +3716,12 @@ LoadSignatureList ( goto ON_EXIT; } + FormatNameString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_NAME_FORMAT), NULL); + FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_HELP_FORMAT), NULL); + if (FormatNameString == NULL || FormatHelpString == NULL) { + goto ON_EXIT; + } + RemainingSize = DataSize; ListWalker = (EFI_SIGNATURE_LIST *)VariableData; while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize)) { @@ -3725,21 +3742,23 @@ LoadSignatureList ( } else { ListType = STRING_TOKEN (STR_LIST_TYPE_UNKNOWN); } + FormatTypeString = HiiGetString (PrivateData->HiiHandle, ListType, NULL); + if (FormatTypeString == NULL) { + goto ON_EXIT; + } ZeroMem (NameBuffer, sizeof (NameBuffer)); - UnicodeSPrint (NameBuffer, - sizeof (NameBuffer), - HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_NAME_FORMAT), NULL), - Index + 1 - ); + UnicodeSPrint (NameBuffer, sizeof (NameBuffer), FormatNameString, Index + 1); ZeroMem (HelpBuffer, sizeof (HelpBuffer)); UnicodeSPrint (HelpBuffer, sizeof (HelpBuffer), - HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_HELP_FORMAT), NULL), - HiiGetString (PrivateData->HiiHandle, ListType, NULL), + FormatHelpString, + FormatTypeString, SIGNATURE_DATA_COUNTS (ListWalker) ); + SECUREBOOT_FREE_NON_NULL (FormatTypeString); + FormatTypeString = NULL; HiiCreateGotoOpCode ( StartOpCodeHandle, @@ -3777,6 +3796,8 @@ ON_EXIT: SECUREBOOT_FREE_NON_OPCODE (EndGotoHandle); SECUREBOOT_FREE_NON_NULL (VariableData); + SECUREBOOT_FREE_NON_NULL (FormatNameString); + SECUREBOOT_FREE_NON_NULL (FormatHelpString); PrivateData->ListCount = Index; @@ -3922,6 +3943,8 @@ FormatHelpInfo ( EFI_STATUS Status; EFI_TIME *Time; EFI_STRING_ID ListTypeId; + EFI_STRING FormatHelpString; + EFI_STRING FormatTypeString; UINTN DataSize; UINTN HelpInfoIndex; UINTN TotalSize; @@ -3931,12 +3954,13 @@ FormatHelpInfo ( CHAR16 *HelpInfoString; BOOLEAN IsCert; - Status = EFI_SUCCESS; - Time = NULL; - HelpInfoIndex = 0; - DataString = NULL; - HelpInfoString = NULL; - IsCert = FALSE; + Status = EFI_SUCCESS; + Time = NULL; + FormatTypeString = NULL; + HelpInfoIndex = 0; + DataString = NULL; + HelpInfoString = NULL; + IsCert = FALSE; if (CompareGuid(&ListEntry->SignatureType, &gEfiCertRsa2048Guid)) { ListTypeId = STRING_TOKEN(STR_LIST_TYPE_RSA2048_SHA256); @@ -3969,6 +3993,11 @@ FormatHelpInfo ( goto ON_EXIT; } + FormatTypeString = HiiGetString (PrivateData->HiiHandle, ListTypeId, NULL); + if (FormatTypeString == NULL) { + goto ON_EXIT; + } + TotalSize = 1024; HelpInfoString = AllocateZeroPool (TotalSize); if (HelpInfoString == NULL) { @@ -3981,40 +4010,45 @@ FormatHelpInfo ( // ZeroMem (GuidString, sizeof (GuidString)); GuidToString(&DataEntry->SignatureOwner, GuidString, BUFFER_MAX_SIZE); + FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_GUID), NULL); + if (FormatHelpString == NULL) { + goto ON_EXIT; + } HelpInfoIndex += UnicodeSPrint ( &HelpInfoString[HelpInfoIndex], TotalSize - sizeof(CHAR16) * HelpInfoIndex, - HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_GUID), NULL), + FormatHelpString, GuidString ); + SECUREBOOT_FREE_NON_NULL (FormatHelpString); + FormatHelpString = NULL; // // Format content part, it depends on the type of signature list, hash value or CN. // if (IsCert) { GetCommonNameFromX509 (ListEntry, DataEntry, &DataString); - HelpInfoIndex += UnicodeSPrint( - &HelpInfoString[HelpInfoIndex], - TotalSize - sizeof(CHAR16) * HelpInfoIndex, - HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_CN), NULL), - HiiGetString (PrivateData->HiiHandle, ListTypeId, NULL), - DataSize, - DataString - ); + FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_CN), NULL); } else { // // Format hash value for each signature data entry. // ParseHashValue (ListEntry, DataEntry, &DataString); - HelpInfoIndex += UnicodeSPrint ( - &HelpInfoString[HelpInfoIndex], - TotalSize - sizeof(CHAR16) * HelpInfoIndex, - HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_HASH), NULL), - HiiGetString (PrivateData->HiiHandle, ListTypeId, NULL), - DataSize, - DataString - ); + FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_HASH), NULL); + } + if (FormatHelpString == NULL) { + goto ON_EXIT; } + HelpInfoIndex += UnicodeSPrint ( + &HelpInfoString[HelpInfoIndex], + TotalSize - sizeof (CHAR16) * HelpInfoIndex, + FormatHelpString, + FormatTypeString, + DataSize, + DataString + ); + SECUREBOOT_FREE_NON_NULL (FormatHelpString); + FormatHelpString = NULL; // // Format revocation time part. @@ -4032,13 +4066,18 @@ FormatHelpInfo ( Time->Minute, Time->Second ); - + FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_TIME), NULL); + if (FormatHelpString == NULL) { + goto ON_EXIT; + } UnicodeSPrint ( &HelpInfoString[HelpInfoIndex], TotalSize - sizeof (CHAR16) * HelpInfoIndex, - HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_TIME), NULL), + FormatHelpString, TimeString ); + SECUREBOOT_FREE_NON_NULL (FormatHelpString); + FormatHelpString = NULL; } *StringId = HiiSetString (PrivateData->HiiHandle, 0, HelpInfoString, NULL); @@ -4046,6 +4085,8 @@ ON_EXIT: SECUREBOOT_FREE_NON_NULL (DataString); SECUREBOOT_FREE_NON_NULL (HelpInfoString); + SECUREBOOT_FREE_NON_NULL (FormatTypeString); + return Status; } @@ -4076,6 +4117,7 @@ LoadSignatureData ( EFI_IFR_GUID_LABEL *StartLabel; EFI_IFR_GUID_LABEL *EndLabel; EFI_STRING_ID HelpStringId; + EFI_STRING FormatNameString; VOID *StartOpCodeHandle; VOID *EndOpCodeHandle; UINTN DataSize; @@ -4086,6 +4128,7 @@ LoadSignatureData ( CHAR16 NameBuffer[BUFFER_MAX_SIZE]; Status = EFI_SUCCESS; + FormatNameString = NULL; StartOpCodeHandle = NULL; EndOpCodeHandle = NULL; Index = 0; @@ -4167,17 +4210,18 @@ LoadSignatureData ( ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize); } + FormatNameString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_NAME_FORMAT), NULL); + if (FormatNameString == NULL) { + goto ON_EXIT; + } + DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)ListWalker + sizeof(EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize); for (Index = 0; Index < SIGNATURE_DATA_COUNTS(ListWalker); Index = Index + 1) { // // Format name buffer. // ZeroMem (NameBuffer, sizeof (NameBuffer)); - UnicodeSPrint (NameBuffer, - sizeof (NameBuffer), - HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_NAME_FORMAT), NULL), - Index + 1 - ); + UnicodeSPrint (NameBuffer, sizeof (NameBuffer), FormatNameString, Index + 1); // // Format help info buffer. @@ -4221,6 +4265,7 @@ ON_EXIT: SECUREBOOT_FREE_NON_OPCODE (EndOpCodeHandle); SECUREBOOT_FREE_NON_NULL (VariableData); + SECUREBOOT_FREE_NON_NULL (FormatNameString); return Status; }