**/\r
\r
#include "SecureBootConfigImpl.h"\r
+#include <Library/BaseCryptLib.h>\r
\r
CHAR16 mSecureBootStorageName[] = L"SECUREBOOT_CONFIGURATION";\r
\r
}\r
\r
/**\r
- Delete a signature entry from siganture database.\r
+ Delete a signature entry from signature database.\r
\r
@param[in] PrivateData Module's private data.\r
@param[in] VariableName The variable name of the vendor's signature database.\r
@param[in] QuestionIdBase Base question id of the signature list.\r
@param[in] DeleteIndex Signature index to delete.\r
\r
- @retval EFI_SUCCESS Delete siganture successfully.\r
+ @retval EFI_SUCCESS Delete signature successfully.\r
@retval EFI_NOT_FOUND Can't find the signature item,\r
@retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
**/\r
);\r
}\r
\r
+/**\r
+ This function to delete signature list or data, according by DelType.\r
+\r
+ @param[in] PrivateData Module's private data.\r
+ @param[in] DelType Indicate delete signature list or data.\r
+ @param[in] CheckedCount Indicate how many signature data have\r
+ been checked in current signature list.\r
+\r
+ @retval EFI_SUCCESS Success to update the signature list page\r
+ @retval EFI_OUT_OF_RESOURCES Unable to allocate required resources.\r
+**/\r
+EFI_STATUS\r
+DeleteSignatureEx (\r
+ IN SECUREBOOT_CONFIG_PRIVATE_DATA *PrivateData,\r
+ IN SIGNATURE_DELETE_TYPE DelType,\r
+ IN UINT32 CheckedCount\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_SIGNATURE_LIST *ListWalker;\r
+ EFI_SIGNATURE_LIST *NewCertList;\r
+ EFI_SIGNATURE_DATA *DataWalker;\r
+ CHAR16 *VariableName;\r
+ UINT32 VariableAttr;\r
+ UINTN VariableDataSize;\r
+ UINTN RemainingSize;\r
+ UINTN ListIndex;\r
+ UINTN Index;\r
+ UINTN Offset;\r
+ UINT8 *VariableData;\r
+ UINT8 *NewVariableData;\r
+\r
+ Status = EFI_SUCCESS;\r
+ VariableName = NULL;\r
+ VariableAttr = 0;\r
+ VariableDataSize = 0;\r
+ ListIndex = 0;\r
+ Offset = 0;\r
+ VariableData = NULL;\r
+ NewVariableData = NULL;\r
+\r
+ VariableName = AllocateZeroPool (100);\r
+ if (VariableName == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ if (PrivateData->VariableName == VARIABLE_DB) {\r
+ UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE);\r
+ } else if (PrivateData->VariableName == VARIABLE_DBX) {\r
+ UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE1);\r
+ } else if (PrivateData->VariableName == VARIABLE_DBT) {\r
+ UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE2);\r
+ } else {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ Status = gRT->GetVariable (\r
+ VariableName,\r
+ &gEfiImageSecurityDatabaseGuid,\r
+ &VariableAttr,\r
+ &VariableDataSize,\r
+ VariableData\r
+ );\r
+ if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ VariableData = AllocateZeroPool (VariableDataSize);\r
+ if (VariableData == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ Status = gRT->GetVariable (\r
+ VariableName,\r
+ &gEfiImageSecurityDatabaseGuid,\r
+ &VariableAttr,\r
+ &VariableDataSize,\r
+ VariableData\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ Status = SetSecureBootMode (CUSTOM_SECURE_BOOT_MODE);\r
+ if (EFI_ERROR (Status)) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ NewVariableData = AllocateZeroPool (VariableDataSize);\r
+ if (NewVariableData == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ RemainingSize = VariableDataSize;\r
+ ListWalker = (EFI_SIGNATURE_LIST *)(VariableData);\r
+ if (DelType == DELETE_SIGNATURE_LIST_ALL) {\r
+ VariableDataSize = 0;\r
+ } else {\r
+ while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) {\r
+ CopyMem ((UINT8 *)NewVariableData + Offset, ListWalker, ListWalker->SignatureListSize);\r
+ Offset += ListWalker->SignatureListSize;\r
+\r
+ RemainingSize -= ListWalker->SignatureListSize;\r
+ ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);\r
+ ListIndex++;\r
+ }\r
+\r
+ if (CheckedCount == SIGNATURE_DATA_COUNTS (ListWalker) || DelType == DELETE_SIGNATURE_LIST_ONE) {\r
+ RemainingSize -= ListWalker->SignatureListSize;\r
+ ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);\r
+ } else {\r
+ NewCertList = (EFI_SIGNATURE_LIST *)(NewVariableData + Offset);\r
+ //\r
+ // Copy header.\r
+ //\r
+ CopyMem ((UINT8 *)NewVariableData, ListWalker, sizeof (EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize);\r
+ Offset += sizeof (EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize;\r
+\r
+ DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)ListWalker + sizeof(EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize);\r
+ for (Index = 0; Index < SIGNATURE_DATA_COUNTS(ListWalker); Index = Index + 1) {\r
+ if (PrivateData->CheckArray[Index]) {\r
+ //\r
+ // Delete checked signature data, and update the size of whole signature list.\r
+ //\r
+ NewCertList->SignatureListSize -= NewCertList->SignatureSize;\r
+ } else {\r
+ //\r
+ // Remain the unchecked signature data.\r
+ //\r
+ CopyMem ((UINT8 *)NewVariableData + Offset, DataWalker, ListWalker->SignatureSize);\r
+ Offset += ListWalker->SignatureSize;\r
+ }\r
+ DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)DataWalker + ListWalker->SignatureSize);\r
+ }\r
+\r
+ RemainingSize -= ListWalker->SignatureListSize;\r
+ }\r
+\r
+ //\r
+ // Copy remaining data, maybe 0.\r
+ //\r
+ CopyMem((UINT8 *)NewVariableData + Offset, ListWalker, RemainingSize);\r
+ Offset += RemainingSize;\r
+\r
+ VariableDataSize = Offset;\r
+ }\r
+\r
+ if ((VariableAttr & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) {\r
+ Status = CreateTimeBasedPayload (&VariableDataSize, &NewVariableData);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Fail to create time-based data payload: %r", Status));\r
+ goto ON_EXIT;\r
+ }\r
+ }\r
+\r
+ Status = gRT->SetVariable (\r
+ VariableName,\r
+ &gEfiImageSecurityDatabaseGuid,\r
+ VariableAttr,\r
+ VariableDataSize,\r
+ NewVariableData\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failed to set variable, Status = %r", Status));\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ON_EXIT:\r
+ SECUREBOOT_FREE_NON_NULL (VariableName);\r
+ SECUREBOOT_FREE_NON_NULL (VariableData);\r
+ SECUREBOOT_FREE_NON_NULL (NewVariableData);\r
+\r
+ return Status;\r
+}\r
+\r
/**\r
\r
Update SecureBoot strings based on new Secure Boot Mode State. String includes STR_SECURE_BOOT_STATE_CONTENT\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ This function to load signature list, the update the menu page.\r
+\r
+ @param[in] PrivateData Module's private data.\r
+ @param[in] LabelId Label number to insert opcodes.\r
+ @param[in] FormId Form ID of current page.\r
+ @param[in] QuestionIdBase Base question id of the signature list.\r
+\r
+ @retval EFI_SUCCESS Success to update the signature list page\r
+ @retval EFI_OUT_OF_RESOURCES Unable to allocate required resources.\r
+**/\r
+EFI_STATUS\r
+LoadSignatureList (\r
+ IN SECUREBOOT_CONFIG_PRIVATE_DATA *PrivateData,\r
+ IN UINT16 LabelId,\r
+ IN EFI_FORM_ID FormId,\r
+ IN EFI_QUESTION_ID QuestionIdBase\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_STRING_ID ListType;\r
+ EFI_SIGNATURE_LIST *ListWalker;\r
+ EFI_IFR_GUID_LABEL *StartLabel;\r
+ EFI_IFR_GUID_LABEL *EndLabel;\r
+ EFI_IFR_GUID_LABEL *StartGoto;\r
+ EFI_IFR_GUID_LABEL *EndGoto;\r
+ EFI_FORM_ID DstFormId;\r
+ VOID *StartOpCodeHandle;\r
+ VOID *EndOpCodeHandle;\r
+ VOID *StartGotoHandle;\r
+ VOID *EndGotoHandle;\r
+ UINTN DataSize;\r
+ UINTN RemainingSize;\r
+ UINT16 Index;\r
+ UINT8 *VariableData;\r
+ CHAR16 *VariableName;\r
+ CHAR16 *NameBuffer;\r
+ CHAR16 *HelpBuffer;\r
+\r
+ Status = EFI_SUCCESS;\r
+ StartOpCodeHandle = NULL;\r
+ EndOpCodeHandle = NULL;\r
+ StartGotoHandle = NULL;\r
+ EndGotoHandle = NULL;\r
+ Index = 0;\r
+ VariableData = NULL;\r
+ VariableName = NULL;\r
+ NameBuffer = NULL;\r
+ HelpBuffer = NULL;\r
+\r
+ //\r
+ // Initialize the container for dynamic opcodes.\r
+ //\r
+ StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ if (StartOpCodeHandle == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ if (EndOpCodeHandle == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ StartGotoHandle = HiiAllocateOpCodeHandle ();\r
+ if (StartGotoHandle == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ EndGotoHandle = HiiAllocateOpCodeHandle ();\r
+ if (EndGotoHandle == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ //\r
+ // Create Hii Extend Label OpCode.\r
+ //\r
+ StartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (\r
+ StartOpCodeHandle,\r
+ &gEfiIfrTianoGuid,\r
+ NULL,\r
+ sizeof (EFI_IFR_GUID_LABEL)\r
+ );\r
+ StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ StartLabel->Number = LabelId;\r
+\r
+ EndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (\r
+ EndOpCodeHandle,\r
+ &gEfiIfrTianoGuid,\r
+ NULL,\r
+ sizeof (EFI_IFR_GUID_LABEL)\r
+ );\r
+ EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ EndLabel->Number = LABEL_END;\r
+\r
+ StartGoto = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode(\r
+ StartGotoHandle,\r
+ &gEfiIfrTianoGuid,\r
+ NULL,\r
+ sizeof(EFI_IFR_GUID_LABEL)\r
+ );\r
+ StartGoto->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ StartGoto->Number = LABEL_DELETE_ALL_LIST_BUTTON;\r
+\r
+ EndGoto = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode(\r
+ EndGotoHandle,\r
+ &gEfiIfrTianoGuid,\r
+ NULL,\r
+ sizeof(EFI_IFR_GUID_LABEL)\r
+ );\r
+ EndGoto->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ EndGoto->Number = LABEL_END;\r
+\r
+ VariableName = AllocateZeroPool (100);\r
+ if (VariableName == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ if (PrivateData->VariableName == VARIABLE_DB) {\r
+ UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE);\r
+ DstFormId = FORMID_SECURE_BOOT_DB_OPTION_FORM;\r
+ } else if (PrivateData->VariableName == VARIABLE_DBX) {\r
+ UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE1);\r
+ DstFormId = FORMID_SECURE_BOOT_DBX_OPTION_FORM;\r
+ } else if (PrivateData->VariableName == VARIABLE_DBT) {\r
+ UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE2);\r
+ DstFormId = FORMID_SECURE_BOOT_DBT_OPTION_FORM;\r
+ } else {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ HiiCreateGotoOpCode (\r
+ StartGotoHandle,\r
+ DstFormId,\r
+ STRING_TOKEN (STR_SECURE_BOOT_DELETE_ALL_LIST),\r
+ STRING_TOKEN (STR_SECURE_BOOT_DELETE_ALL_LIST),\r
+ EFI_IFR_FLAG_CALLBACK,\r
+ KEY_SECURE_BOOT_DELETE_ALL_LIST\r
+ );\r
+\r
+ //\r
+ // Read Variable, the variable name save in the PrivateData->VariableName.\r
+ //\r
+ DataSize = 0;\r
+ Status = gRT->GetVariable (VariableName, &gEfiImageSecurityDatabaseGuid, NULL, &DataSize, VariableData);\r
+ if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ VariableData = AllocateZeroPool (DataSize);\r
+ if (VariableData == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+ Status = gRT->GetVariable (VariableName, &gEfiImageSecurityDatabaseGuid, NULL, &DataSize, VariableData);\r
+ if (EFI_ERROR (Status)) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ NameBuffer = AllocateZeroPool (100);\r
+ if (NameBuffer == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ HelpBuffer = AllocateZeroPool (100);\r
+ if (HelpBuffer == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ RemainingSize = DataSize;\r
+ ListWalker = (EFI_SIGNATURE_LIST *)VariableData;\r
+ while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize)) {\r
+ if (CompareGuid (&ListWalker->SignatureType, &gEfiCertRsa2048Guid)) {\r
+ ListType = STRING_TOKEN (STR_LIST_TYPE_RSA2048_SHA256);\r
+ } else if (CompareGuid (&ListWalker->SignatureType, &gEfiCertX509Guid)) {\r
+ ListType = STRING_TOKEN (STR_LIST_TYPE_X509);\r
+ } else if (CompareGuid (&ListWalker->SignatureType, &gEfiCertSha1Guid)) {\r
+ ListType = STRING_TOKEN (STR_LIST_TYPE_SHA1);\r
+ } else if (CompareGuid (&ListWalker->SignatureType, &gEfiCertSha256Guid)) {\r
+ ListType = STRING_TOKEN (STR_LIST_TYPE_SHA256);\r
+ } else if (CompareGuid (&ListWalker->SignatureType, &gEfiCertX509Sha256Guid)) {\r
+ ListType = STRING_TOKEN (STR_LIST_TYPE_X509_SHA256);\r
+ } else if (CompareGuid (&ListWalker->SignatureType, &gEfiCertX509Sha384Guid)) {\r
+ ListType = STRING_TOKEN (STR_LIST_TYPE_X509_SHA384);\r
+ } else if (CompareGuid (&ListWalker->SignatureType, &gEfiCertX509Sha512Guid)) {\r
+ ListType = STRING_TOKEN (STR_LIST_TYPE_X509_SHA512);\r
+ } else {\r
+ ListType = STRING_TOKEN (STR_LIST_TYPE_UNKNOWN);\r
+ }\r
+\r
+ UnicodeSPrint (NameBuffer,\r
+ 100,\r
+ HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_NAME_FORMAT), NULL),\r
+ Index + 1\r
+ );\r
+ UnicodeSPrint (HelpBuffer,\r
+ 100,\r
+ HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_HELP_FORMAT), NULL),\r
+ HiiGetString (PrivateData->HiiHandle, ListType, NULL),\r
+ SIGNATURE_DATA_COUNTS (ListWalker)\r
+ );\r
+\r
+ HiiCreateGotoOpCode (\r
+ StartOpCodeHandle,\r
+ SECUREBOOT_DELETE_SIGNATURE_DATA_FORM,\r
+ HiiSetString (PrivateData->HiiHandle, 0, NameBuffer, NULL),\r
+ HiiSetString (PrivateData->HiiHandle, 0, HelpBuffer, NULL),\r
+ EFI_IFR_FLAG_CALLBACK,\r
+ QuestionIdBase + Index++\r
+ );\r
+\r
+ ZeroMem (NameBuffer, 100);\r
+ ZeroMem (HelpBuffer, 100);\r
+\r
+ RemainingSize -= ListWalker->SignatureListSize;\r
+ ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);\r
+ }\r
+\r
+ON_EXIT:\r
+ HiiUpdateForm (\r
+ PrivateData->HiiHandle,\r
+ &gSecureBootConfigFormSetGuid,\r
+ FormId,\r
+ StartOpCodeHandle,\r
+ EndOpCodeHandle\r
+ );\r
+\r
+ HiiUpdateForm (\r
+ PrivateData->HiiHandle,\r
+ &gSecureBootConfigFormSetGuid,\r
+ FormId,\r
+ StartGotoHandle,\r
+ EndGotoHandle\r
+ );\r
+\r
+ SECUREBOOT_FREE_NON_OPCODE (StartOpCodeHandle);\r
+ SECUREBOOT_FREE_NON_OPCODE (EndOpCodeHandle);\r
+ SECUREBOOT_FREE_NON_OPCODE (StartGotoHandle);\r
+ SECUREBOOT_FREE_NON_OPCODE (EndGotoHandle);\r
+\r
+ SECUREBOOT_FREE_NON_NULL (VariableName);\r
+ SECUREBOOT_FREE_NON_NULL (VariableData);\r
+ SECUREBOOT_FREE_NON_NULL (NameBuffer);\r
+ SECUREBOOT_FREE_NON_NULL (HelpBuffer);\r
+\r
+ PrivateData->ListCount = Index;\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Parse hash value from EFI_SIGNATURE_DATA, and save in the CHAR16 type array.\r
+ The buffer is callee allocated and should be freed by the caller.\r
+\r
+ @param[in] ListEntry The pointer point to the signature list.\r
+ @param[in] DataEntry The signature data we are processing.\r
+ @param[out] BufferToReturn Buffer to save the hash value.\r
+\r
+ @retval EFI_INVALID_PARAMETER Invalid List or Data or Buffer.\r
+ @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
+ @retval EFI_SUCCESS Operation success.\r
+**/\r
+EFI_STATUS\r
+ParseHashValue (\r
+ IN EFI_SIGNATURE_LIST *ListEntry,\r
+ IN EFI_SIGNATURE_DATA *DataEntry,\r
+ OUT CHAR16 **BufferToReturn\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINTN BufferIndex;\r
+ UINTN TotalSize;\r
+ UINTN DataSize;\r
+ UINTN Line;\r
+ UINTN OneLineBytes;\r
+\r
+ //\r
+ // Assume that, display 8 bytes in one line.\r
+ //\r
+ OneLineBytes = 8;\r
+\r
+ if (ListEntry == NULL || DataEntry == NULL || BufferToReturn == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ DataSize = ListEntry->SignatureSize - sizeof(EFI_GUID);\r
+ Line = (DataSize + OneLineBytes - 1) / OneLineBytes;\r
+\r
+ //\r
+ // Each byte will split two Hex-number, and each line need additional memory to save '\r\n'.\r
+ //\r
+ TotalSize = ((DataSize + Line) * 2 * sizeof(CHAR16));\r
+\r
+ *BufferToReturn = AllocateZeroPool(TotalSize);\r
+ if (*BufferToReturn == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ for (Index = 0, BufferIndex = 0; Index < DataSize; Index = Index + 1) {\r
+ if ((Index > 0) && (Index % OneLineBytes == 0)) {\r
+ BufferIndex += UnicodeSPrint(&(*BufferToReturn)[BufferIndex], TotalSize - sizeof(CHAR16) * BufferIndex, L"\n");\r
+ }\r
+ BufferIndex += UnicodeSPrint(&(*BufferToReturn)[BufferIndex], TotalSize - sizeof(CHAR16) * BufferIndex, L"%02x", DataEntry->SignatureData[Index]);\r
+ }\r
+ BufferIndex += UnicodeSPrint(&(*BufferToReturn)[BufferIndex], TotalSize - sizeof(CHAR16) * BufferIndex, L"\n");\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Function to get the common name from the X509 format certificate.\r
+ The buffer is callee allocated and should be freed by the caller.\r
+\r
+ @param[in] ListEntry The pointer point to the signature list.\r
+ @param[in] DataEntry The signature data we are processing.\r
+ @param[out] BufferToReturn Buffer to save the CN of X509 certificate.\r
+\r
+ @retval EFI_INVALID_PARAMETER Invalid List or Data or Buffer.\r
+ @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
+ @retval EFI_SUCCESS Operation success.\r
+ @retval EFI_NOT_FOUND Not found CN field in the X509 certificate.\r
+**/\r
+EFI_STATUS\r
+GetCommonNameFromX509 (\r
+ IN EFI_SIGNATURE_LIST *ListEntry,\r
+ IN EFI_SIGNATURE_DATA *DataEntry,\r
+ OUT CHAR16 **BufferToReturn\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ CHAR8 *CNBuffer;\r
+ UINTN CNBufferSize;\r
+\r
+ Status = EFI_SUCCESS;\r
+ CNBuffer = NULL;\r
+\r
+ CNBuffer = AllocateZeroPool(256);\r
+ if (CNBuffer == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ CNBufferSize = 256;\r
+ X509GetCommonName (\r
+ (UINT8 *)DataEntry + sizeof(EFI_GUID),\r
+ ListEntry->SignatureSize - sizeof(EFI_GUID),\r
+ CNBuffer,\r
+ &CNBufferSize\r
+ );\r
+\r
+ *BufferToReturn = AllocateZeroPool(256 * sizeof(CHAR16));\r
+ if (*BufferToReturn == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ AsciiStrToUnicodeStrS (CNBuffer, *BufferToReturn, 256);\r
+\r
+ON_EXIT:\r
+ SECUREBOOT_FREE_NON_NULL (CNBuffer);\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Format the help info for the signature data, each help info contain 3 parts.\r
+ 1. Onwer Guid.\r
+ 2. Content, depends on the type of the signature list.\r
+ 3. Revocation time.\r
+\r
+ @param[in] PrivateData Module's private data.\r
+ @param[in] ListEntry Point to the signature list.\r
+ @param[in] DataEntry Point to the signature data we are processing.\r
+ @param[out] StringId Save the string id of help info.\r
+\r
+ @retval EFI_SUCCESS Operation success.\r
+ @retval EFI_OUT_OF_RESOURCES Unable to allocate required resources.\r
+**/\r
+EFI_STATUS\r
+FormatHelpInfo (\r
+ IN SECUREBOOT_CONFIG_PRIVATE_DATA *PrivateData,\r
+ IN EFI_SIGNATURE_LIST *ListEntry,\r
+ IN EFI_SIGNATURE_DATA *DataEntry,\r
+ OUT EFI_STRING_ID *StringId\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_TIME *Time;\r
+ EFI_STRING_ID ListTypeId;\r
+ UINTN DataSize;\r
+ UINTN HelpInfoIndex;\r
+ UINTN TotalSize;\r
+ CHAR16 *GuidString;\r
+ CHAR16 *DataString;\r
+ CHAR16 *TimeString;\r
+ CHAR16 *HelpInfoString;\r
+ BOOLEAN IsCert;\r
+\r
+ Status = EFI_SUCCESS;\r
+ Time = NULL;\r
+ HelpInfoIndex = 0;\r
+ GuidString = NULL;\r
+ DataString = NULL;\r
+ TimeString = NULL;\r
+ HelpInfoString = NULL;\r
+ IsCert = FALSE;\r
+\r
+ if (CompareGuid(&ListEntry->SignatureType, &gEfiCertRsa2048Guid)) {\r
+ ListTypeId = STRING_TOKEN(STR_LIST_TYPE_RSA2048_SHA256);\r
+ DataSize = ListEntry->SignatureSize - sizeof(EFI_GUID);\r
+ IsCert = TRUE;\r
+ } else if (CompareGuid(&ListEntry->SignatureType, &gEfiCertX509Guid)) {\r
+ ListTypeId = STRING_TOKEN(STR_LIST_TYPE_X509);\r
+ DataSize = ListEntry->SignatureSize - sizeof(EFI_GUID);\r
+ IsCert = TRUE;\r
+ } else if (CompareGuid(&ListEntry->SignatureType, &gEfiCertSha1Guid)) {\r
+ ListTypeId = STRING_TOKEN(STR_LIST_TYPE_SHA1);\r
+ DataSize = 20;\r
+ } else if (CompareGuid(&ListEntry->SignatureType, &gEfiCertSha256Guid)) {\r
+ ListTypeId = STRING_TOKEN(STR_LIST_TYPE_SHA256);\r
+ DataSize = 32;\r
+ } else if (CompareGuid(&ListEntry->SignatureType, &gEfiCertX509Sha256Guid)) {\r
+ ListTypeId = STRING_TOKEN(STR_LIST_TYPE_X509_SHA256);\r
+ DataSize = 32;\r
+ Time = (EFI_TIME *)(DataEntry->SignatureData + DataSize);\r
+ } else if (CompareGuid(&ListEntry->SignatureType, &gEfiCertX509Sha384Guid)) {\r
+ ListTypeId = STRING_TOKEN(STR_LIST_TYPE_X509_SHA384);\r
+ DataSize = 48;\r
+ Time = (EFI_TIME *)(DataEntry->SignatureData + DataSize);\r
+ } else if (CompareGuid(&ListEntry->SignatureType, &gEfiCertX509Sha512Guid)) {\r
+ ListTypeId = STRING_TOKEN(STR_LIST_TYPE_X509_SHA512);\r
+ DataSize = 64;\r
+ Time = (EFI_TIME *)(DataEntry->SignatureData + DataSize);\r
+ } else {\r
+ Status = EFI_UNSUPPORTED;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ GuidString = AllocateZeroPool (100);\r
+ if (GuidString == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ TotalSize = 1024;\r
+ HelpInfoString = AllocateZeroPool (TotalSize);\r
+ if (HelpInfoString == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ //\r
+ // Format GUID part.\r
+ //\r
+ GuidToString(&DataEntry->SignatureOwner, GuidString, 100);\r
+ HelpInfoIndex += UnicodeSPrint (\r
+ &HelpInfoString[HelpInfoIndex],\r
+ TotalSize - sizeof(CHAR16) * HelpInfoIndex,\r
+ HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_GUID), NULL),\r
+ GuidString\r
+ );\r
+\r
+ //\r
+ // Format content part, it depends on the type of signature list, hash value or CN.\r
+ //\r
+ if (IsCert) {\r
+ GetCommonNameFromX509 (ListEntry, DataEntry, &DataString);\r
+ HelpInfoIndex += UnicodeSPrint(\r
+ &HelpInfoString[HelpInfoIndex],\r
+ TotalSize - sizeof(CHAR16) * HelpInfoIndex,\r
+ HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_CN), NULL),\r
+ HiiGetString (PrivateData->HiiHandle, ListTypeId, NULL),\r
+ DataSize,\r
+ DataString\r
+ );\r
+ } else {\r
+ //\r
+ // Format hash value for each signature data entry.\r
+ //\r
+ ParseHashValue (ListEntry, DataEntry, &DataString);\r
+ HelpInfoIndex += UnicodeSPrint (\r
+ &HelpInfoString[HelpInfoIndex],\r
+ TotalSize - sizeof(CHAR16) * HelpInfoIndex,\r
+ HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_HASH), NULL),\r
+ HiiGetString (PrivateData->HiiHandle, ListTypeId, NULL),\r
+ DataSize,\r
+ DataString\r
+ );\r
+ }\r
+\r
+ //\r
+ // Format revocation time part.\r
+ //\r
+ if (Time != NULL) {\r
+ TimeString = AllocateZeroPool(100);\r
+ if (TimeString == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ UnicodeSPrint (\r
+ TimeString,\r
+ 100,\r
+ L"%d-%d-%d %d:%d:%d",\r
+ Time->Year,\r
+ Time->Month,\r
+ Time->Day,\r
+ Time->Hour,\r
+ Time->Minute,\r
+ Time->Second\r
+ );\r
+\r
+ UnicodeSPrint (\r
+ &HelpInfoString[HelpInfoIndex],\r
+ TotalSize - sizeof (CHAR16) * HelpInfoIndex,\r
+ HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_TIME), NULL),\r
+ TimeString\r
+ );\r
+ }\r
+\r
+ *StringId = HiiSetString (PrivateData->HiiHandle, 0, HelpInfoString, NULL);\r
+\r
+ON_EXIT:\r
+ SECUREBOOT_FREE_NON_NULL (GuidString);\r
+ SECUREBOOT_FREE_NON_NULL (DataString);\r
+ SECUREBOOT_FREE_NON_NULL (TimeString);\r
+ SECUREBOOT_FREE_NON_NULL (HelpInfoString);\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ This functino to load signature data under the signature list.\r
+\r
+ @param[in] PrivateData Module's private data.\r
+ @param[in] LabelId Label number to insert opcodes.\r
+ @param[in] FormId Form ID of current page.\r
+ @param[in] QuestionIdBase Base question id of the signature list.\r
+ @param[in] ListIndex Indicate to load which signature list.\r
+\r
+ @retval EFI_SUCCESS Success to update the signature list page\r
+ @retval EFI_OUT_OF_RESOURCES Unable to allocate required resources.\r
+**/\r
+EFI_STATUS\r
+LoadSignatureData (\r
+ IN SECUREBOOT_CONFIG_PRIVATE_DATA *PrivateData,\r
+ IN UINT16 LabelId,\r
+ IN EFI_FORM_ID FormId,\r
+ IN EFI_QUESTION_ID QuestionIdBase,\r
+ IN UINT16 ListIndex\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_SIGNATURE_LIST *ListWalker;\r
+ EFI_SIGNATURE_DATA *DataWalker;\r
+ EFI_IFR_GUID_LABEL *StartLabel;\r
+ EFI_IFR_GUID_LABEL *EndLabel;\r
+ EFI_STRING_ID HelpStringId;\r
+ VOID *StartOpCodeHandle;\r
+ VOID *EndOpCodeHandle;\r
+ UINTN DataSize;\r
+ UINTN RemainingSize;\r
+ UINT16 Index;\r
+ UINT8 *VariableData;\r
+ CHAR16 *VariableName;\r
+ CHAR16 *NameBuffer;\r
+\r
+ Status = EFI_SUCCESS;\r
+ StartOpCodeHandle = NULL;\r
+ EndOpCodeHandle = NULL;\r
+ Index = 0;\r
+ VariableData = NULL;\r
+ VariableName = NULL;\r
+ NameBuffer = NULL;\r
+\r
+ //\r
+ // Initialize the container for dynamic opcodes.\r
+ //\r
+ StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ if (StartOpCodeHandle == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ if (EndOpCodeHandle == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ //\r
+ // Create Hii Extend Label OpCode.\r
+ //\r
+ StartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (\r
+ StartOpCodeHandle,\r
+ &gEfiIfrTianoGuid,\r
+ NULL,\r
+ sizeof (EFI_IFR_GUID_LABEL)\r
+ );\r
+ StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ StartLabel->Number = LabelId;\r
+\r
+ EndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (\r
+ EndOpCodeHandle,\r
+ &gEfiIfrTianoGuid,\r
+ NULL,\r
+ sizeof (EFI_IFR_GUID_LABEL)\r
+ );\r
+ EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ EndLabel->Number = LABEL_END;\r
+\r
+ VariableName = AllocateZeroPool (100);\r
+ if (VariableName == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ if (PrivateData->VariableName == VARIABLE_DB) {\r
+ UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE);\r
+ } else if (PrivateData->VariableName == VARIABLE_DBX) {\r
+ UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE1);\r
+ } else if (PrivateData->VariableName == VARIABLE_DBT) {\r
+ UnicodeSPrint (VariableName, 100, EFI_IMAGE_SECURITY_DATABASE2);\r
+ } else {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ //\r
+ // Read Variable, the variable name save in the PrivateData->VariableName.\r
+ //\r
+ DataSize = 0;\r
+ Status = gRT->GetVariable (VariableName, &gEfiImageSecurityDatabaseGuid, NULL, &DataSize, VariableData);\r
+ if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ VariableData = AllocateZeroPool (DataSize);\r
+ if (VariableData == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+ Status = gRT->GetVariable (VariableName, &gEfiImageSecurityDatabaseGuid, NULL, &DataSize, VariableData);\r
+ if (EFI_ERROR (Status)) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ NameBuffer = AllocateZeroPool (100);\r
+ if (NameBuffer == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ RemainingSize = DataSize;\r
+ ListWalker = (EFI_SIGNATURE_LIST *)VariableData;\r
+\r
+ //\r
+ // Skip signature list.\r
+ //\r
+ while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex-- > 0) {\r
+ RemainingSize -= ListWalker->SignatureListSize;\r
+ ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);\r
+ }\r
+\r
+ DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)ListWalker + sizeof(EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize);\r
+ for (Index = 0; Index < SIGNATURE_DATA_COUNTS(ListWalker); Index = Index + 1) {\r
+ //\r
+ // Format name buffer.\r
+ //\r
+ UnicodeSPrint (NameBuffer,\r
+ 100,\r
+ HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_NAME_FORMAT), NULL),\r
+ Index + 1\r
+ );\r
+\r
+ //\r
+ // Format help info buffer.\r
+ //\r
+ Status = FormatHelpInfo (PrivateData, ListWalker, DataWalker, &HelpStringId);\r
+ if (EFI_ERROR (Status)) {\r
+ goto ON_EXIT;\r
+ }\r
+\r
+ HiiCreateCheckBoxOpCode (\r
+ StartOpCodeHandle,\r
+ (EFI_QUESTION_ID)(QuestionIdBase + Index),\r
+ 0,\r
+ 0,\r
+ HiiSetString (PrivateData->HiiHandle, 0, NameBuffer, NULL),\r
+ HelpStringId,\r
+ EFI_IFR_FLAG_CALLBACK,\r
+ 0,\r
+ NULL\r
+ );\r
+\r
+ ZeroMem(NameBuffer, 100);\r
+ DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)DataWalker + ListWalker->SignatureSize);\r
+ }\r
+\r
+ //\r
+ // Allocate a buffer to record which signature data will be checked.\r
+ // This memory buffer will be freed when exit from the SECUREBOOT_DELETE_SIGNATURE_DATA_FORM form.\r
+ //\r
+ PrivateData->CheckArray = AllocateZeroPool (SIGNATURE_DATA_COUNTS (ListWalker) * sizeof (BOOLEAN));\r
+\r
+ON_EXIT:\r
+ HiiUpdateForm (\r
+ PrivateData->HiiHandle,\r
+ &gSecureBootConfigFormSetGuid,\r
+ FormId,\r
+ StartOpCodeHandle,\r
+ EndOpCodeHandle\r
+ );\r
+\r
+ SECUREBOOT_FREE_NON_OPCODE (StartOpCodeHandle);\r
+ SECUREBOOT_FREE_NON_OPCODE (EndOpCodeHandle);\r
+\r
+ SECUREBOOT_FREE_NON_NULL (VariableName);\r
+ SECUREBOOT_FREE_NON_NULL (VariableData);\r
+ SECUREBOOT_FREE_NON_NULL (NameBuffer);\r
+\r
+ return Status;\r
+}\r
+\r
/**\r
This function is called to provide results data to the driver.\r
\r
(QuestionId == KEY_SECURE_BOOT_DBX_OPTION) ||\r
(QuestionId == KEY_SECURE_BOOT_DBT_OPTION)) {\r
CloseEnrolledFile(Private->FileContext);\r
+ } else if (QuestionId == KEY_SECURE_BOOT_DELETE_ALL_LIST) {\r
+ //\r
+ // Update ListCount field in varstore\r
+ // Button "Delete All Signature List" is\r
+ // enable when ListCount is greater than 0.\r
+ //\r
+ IfrNvData->ListCount = Private->ListCount;\r
}\r
}\r
goto EXIT;\r
);\r
break;\r
\r
- case SECUREBOOT_DELETE_SIGNATURE_FROM_DBX:\r
- UpdateDeletePage (\r
+ //\r
+ // From DBX option to the level-1 form, display signature list.\r
+ //\r
+ case KEY_VALUE_FROM_DBX_TO_LIST_FORM:\r
+ Private->VariableName = VARIABLE_DBX;\r
+ LoadSignatureList (\r
Private,\r
- EFI_IMAGE_SECURITY_DATABASE1,\r
- &gEfiImageSecurityDatabaseGuid,\r
- LABEL_DBX_DELETE,\r
- SECUREBOOT_DELETE_SIGNATURE_FROM_DBX,\r
- OPTION_DEL_DBX_QUESTION_ID\r
- );\r
+ LABEL_SIGNATURE_LIST_START,\r
+ SECUREBOOT_DELETE_SIGNATURE_LIST_FORM,\r
+ OPTION_SIGNATURE_LIST_QUESTION_ID\r
+ );\r
+ break;\r
\r
+ //\r
+ // Delete all signature list and reload.\r
+ //\r
+ case KEY_SECURE_BOOT_DELETE_ALL_LIST:\r
+ CreatePopUp(\r
+ EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+ &Key,\r
+ L"Press 'Y' to delete signature list.",\r
+ L"Press other key to cancel and exit.",\r
+ NULL\r
+ );\r
+\r
+ if (Key.UnicodeChar == L'Y' || Key.UnicodeChar == L'y') {\r
+ DeleteSignatureEx (Private, DELETE_SIGNATURE_LIST_ALL, IfrNvData->CheckedDataCount);\r
+ }\r
+\r
+ LoadSignatureList (\r
+ Private,\r
+ LABEL_SIGNATURE_LIST_START,\r
+ SECUREBOOT_DELETE_SIGNATURE_LIST_FORM,\r
+ OPTION_SIGNATURE_LIST_QUESTION_ID\r
+ );\r
+ break;\r
+\r
+ //\r
+ // Delete one signature list and reload.\r
+ //\r
+ case KEY_SECURE_BOOT_DELETE_ALL_DATA:\r
+ CreatePopUp(\r
+ EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+ &Key,\r
+ L"Press 'Y' to delete signature data.",\r
+ L"Press other key to cancel and exit.",\r
+ NULL\r
+ );\r
+\r
+ if (Key.UnicodeChar == L'Y' || Key.UnicodeChar == L'y') {\r
+ DeleteSignatureEx (Private, DELETE_SIGNATURE_LIST_ONE, IfrNvData->CheckedDataCount);\r
+ }\r
+\r
+ LoadSignatureList (\r
+ Private,\r
+ LABEL_SIGNATURE_LIST_START,\r
+ SECUREBOOT_DELETE_SIGNATURE_LIST_FORM,\r
+ OPTION_SIGNATURE_LIST_QUESTION_ID\r
+ );\r
+ break;\r
+\r
+ //\r
+ // Delete checked signature data and reload.\r
+ //\r
+ case KEY_SECURE_BOOT_DELETE_CHECK_DATA:\r
+ CreatePopUp(\r
+ EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+ &Key,\r
+ L"Press 'Y' to delete signature data.",\r
+ L"Press other key to cancel and exit.",\r
+ NULL\r
+ );\r
+\r
+ if (Key.UnicodeChar == L'Y' || Key.UnicodeChar == L'y') {\r
+ DeleteSignatureEx (Private, DELETE_SIGNATURE_DATA, IfrNvData->CheckedDataCount);\r
+ }\r
+\r
+ LoadSignatureList (\r
+ Private,\r
+ LABEL_SIGNATURE_LIST_START,\r
+ SECUREBOOT_DELETE_SIGNATURE_LIST_FORM,\r
+ OPTION_SIGNATURE_LIST_QUESTION_ID\r
+ );\r
break;\r
\r
case SECUREBOOT_DELETE_SIGNATURE_FROM_DBT:\r
OPTION_DEL_DB_QUESTION_ID,\r
QuestionId - OPTION_DEL_DB_QUESTION_ID\r
);\r
- } else if ((QuestionId >= OPTION_DEL_DBX_QUESTION_ID) &&\r
- (QuestionId < (OPTION_DEL_DBX_QUESTION_ID + OPTION_CONFIG_RANGE))) {\r
- DeleteSignature (\r
+ } else if ((QuestionId >= OPTION_SIGNATURE_LIST_QUESTION_ID) &&\r
+ (QuestionId < (OPTION_SIGNATURE_LIST_QUESTION_ID + OPTION_CONFIG_RANGE))) {\r
+ LoadSignatureData (\r
Private,\r
- EFI_IMAGE_SECURITY_DATABASE1,\r
- &gEfiImageSecurityDatabaseGuid,\r
- LABEL_DBX_DELETE,\r
- SECUREBOOT_DELETE_SIGNATURE_FROM_DBX,\r
- OPTION_DEL_DBX_QUESTION_ID,\r
- QuestionId - OPTION_DEL_DBX_QUESTION_ID\r
- );\r
+ LABEL_SIGNATURE_DATA_START,\r
+ SECUREBOOT_DELETE_SIGNATURE_DATA_FORM,\r
+ OPTION_SIGNATURE_DATA_QUESTION_ID,\r
+ QuestionId - OPTION_SIGNATURE_LIST_QUESTION_ID\r
+ );\r
+ Private->ListIndex = QuestionId - OPTION_SIGNATURE_LIST_QUESTION_ID;\r
+ } else if ((QuestionId >= OPTION_SIGNATURE_DATA_QUESTION_ID) &&\r
+ (QuestionId < (OPTION_SIGNATURE_DATA_QUESTION_ID + OPTION_CONFIG_RANGE))) {\r
+ if (Private->CheckArray[QuestionId - OPTION_SIGNATURE_DATA_QUESTION_ID]) {\r
+ IfrNvData->CheckedDataCount--;\r
+ Private->CheckArray[QuestionId - OPTION_SIGNATURE_DATA_QUESTION_ID] = FALSE;\r
+ } else {\r
+ IfrNvData->CheckedDataCount++;\r
+ Private->CheckArray[QuestionId - OPTION_SIGNATURE_DATA_QUESTION_ID] = TRUE;\r
+ }\r
} else if ((QuestionId >= OPTION_DEL_DBT_QUESTION_ID) &&\r
(QuestionId < (OPTION_DEL_DBT_QUESTION_ID + OPTION_CONFIG_RANGE))) {\r
DeleteSignature (\r
if (SecureBootMode != NULL) {\r
FreePool (SecureBootMode);\r
}\r
+\r
+ if (QuestionId == KEY_SECURE_BOOT_DELETE_ALL_DATA) {\r
+ //\r
+ // Free memory when exit from the SECUREBOOT_DELETE_SIGNATURE_DATA_FORM form.\r
+ //\r
+ SECUREBOOT_FREE_NON_NULL (Private->CheckArray);\r
+ IfrNvData->CheckedDataCount = 0;\r
+ }\r
}\r
\r
EXIT:\r