]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigImpl.c
SecurityPkg: remove PE/COFF header workaround for ELILO on IPF
[mirror_edk2.git] / SecurityPkg / VariableAuthenticated / SecureBootConfigDxe / SecureBootConfigImpl.c
index 3e03be9738af01caf2c017c4031d44eaa975b30d..f96325e978a5c5c390f21807b2488667633b33af 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   HII Config Access protocol implementation of SecureBoot configuration module.\r
 \r
-Copyright (c) 2011 - 2017, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -1815,7 +1816,7 @@ LoadPeImage (
   Calculate hash of Pe/Coff image based on the authenticode image hashing in\r
   PE/COFF Specification 8.0 Appendix A\r
 \r
-  Notes: PE/COFF image has been checked by BasePeCoffLib PeCoffLoaderGetImageInfo() in \r
+  Notes: PE/COFF image has been checked by BasePeCoffLib PeCoffLoaderGetImageInfo() in\r
   the function LoadPeImage ().\r
 \r
   @param[in]    HashAlg   Hash algorithm type.\r
@@ -1830,7 +1831,6 @@ HashPeImage (
   )\r
 {\r
   BOOLEAN                   Status;\r
-  UINT16                    Magic;\r
   EFI_IMAGE_SECTION_HEADER  *Section;\r
   VOID                      *HashCtx;\r
   UINTN                     CtxSize;\r
@@ -1873,27 +1873,13 @@ HashPeImage (
   // Measuring PE/COFF Image Header;\r
   // But CheckSum field and SECURITY data directory (certificate) are excluded\r
   //\r
-  if (mNtHeader.Pe32->FileHeader.Machine == IMAGE_FILE_MACHINE_IA64 && mNtHeader.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
-    //\r
-    // NOTE: Some versions of Linux ELILO for Itanium have an incorrect magic value\r
-    //       in the PE/COFF Header. If the MachineType is Itanium(IA64) and the\r
-    //       Magic value in the OptionalHeader is EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC\r
-    //       then override the magic value to EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC\r
-    //\r
-    Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC;\r
-  } else {\r
-    //\r
-    // Get the magic value from the PE/COFF Optional Header\r
-    //\r
-    Magic = mNtHeader.Pe32->OptionalHeader.Magic;\r
-  }\r
 \r
   //\r
   // 3.  Calculate the distance from the base of the image header to the image checksum address.\r
   // 4.  Hash the image header from its base to beginning of the image checksum.\r
   //\r
   HashBase = mImageBase;\r
-  if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+  if (mNtHeader.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
     //\r
     // Use PE32 offset.\r
     //\r
@@ -1914,7 +1900,7 @@ HashPeImage (
   // 6.  Get the address of the beginning of the Cert Directory.\r
   // 7.  Hash everything from the end of the checksum to the start of the Cert Directory.\r
   //\r
-  if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+  if (mNtHeader.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
     //\r
     // Use PE32 offset.\r
     //\r
@@ -1936,7 +1922,7 @@ HashPeImage (
   // 8.  Skip over the Cert Directory. (It is sizeof(IMAGE_DATA_DIRECTORY) bytes.)\r
   // 9.  Hash everything from the end of the Cert Directory to the end of image header.\r
   //\r
-  if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+  if (mNtHeader.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
     //\r
     // Use PE32 offset\r
     //\r
@@ -1957,7 +1943,7 @@ HashPeImage (
   //\r
   // 10. Set the SUM_OF_BYTES_HASHED to the size of the header.\r
   //\r
-  if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+  if (mNtHeader.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
     //\r
     // Use PE32 offset.\r
     //\r
@@ -2031,7 +2017,7 @@ HashPeImage (
   //\r
   if (mImageSize > SumOfBytesHashed) {\r
     HashBase = mImageBase + SumOfBytesHashed;\r
-    if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+    if (mNtHeader.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
       //\r
       // Use PE32 offset.\r
       //\r
@@ -3073,7 +3059,7 @@ DeleteSignatureEx (
   EFI_SIGNATURE_LIST  *ListWalker;\r
   EFI_SIGNATURE_LIST  *NewCertList;\r
   EFI_SIGNATURE_DATA  *DataWalker;\r
-  CHAR16              *VariableName;\r
+  CHAR16              VariableName[BUFFER_MAX_SIZE];\r
   UINT32              VariableAttr;\r
   UINTN               VariableDataSize;\r
   UINTN               RemainingSize;\r
@@ -3084,7 +3070,6 @@ DeleteSignatureEx (
   UINT8               *NewVariableData;\r
 \r
   Status              = EFI_SUCCESS;\r
-  VariableName        = NULL;\r
   VariableAttr        = 0;\r
   VariableDataSize    = 0;\r
   ListIndex           = 0;\r
@@ -3092,18 +3077,12 @@ DeleteSignatureEx (
   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
+  if (PrivateData->VariableName == Variable_DB) {\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE);\r
+  } else if (PrivateData->VariableName == Variable_DBX) {\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE1);\r
+  } else if (PrivateData->VariableName == Variable_DBT) {\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE2);\r
   } else {\r
     goto ON_EXIT;\r
   }\r
@@ -3149,9 +3128,12 @@ DeleteSignatureEx (
 \r
   RemainingSize = VariableDataSize;\r
   ListWalker = (EFI_SIGNATURE_LIST *)(VariableData);\r
-  if (DelType == DELETE_SIGNATURE_LIST_ALL) {\r
+  if (DelType == Delete_Signature_List_All) {\r
     VariableDataSize = 0;\r
   } else {\r
+    //\r
+    //  Traverse to target EFI_SIGNATURE_LIST but others will be skipped.\r
+    //\r
     while ((RemainingSize > 0) && (RemainingSize >= ListWalker->SignatureListSize) && ListIndex < PrivateData->ListIndex) {\r
       CopyMem ((UINT8 *)NewVariableData + Offset, ListWalker, ListWalker->SignatureListSize);\r
       Offset += ListWalker->SignatureListSize;\r
@@ -3161,15 +3143,17 @@ DeleteSignatureEx (
       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
+    //\r
+    //  Handle the target EFI_SIGNATURE_LIST.\r
+    //  If CheckedCount == SIGNATURE_DATA_COUNTS (ListWalker) or DelType == Delete_Signature_List_One\r
+    //  it means delete the whole EFI_SIGNATURE_LIST, So we just skip this EFI_SIGNATURE_LIST.\r
+    //\r
+    if (CheckedCount < SIGNATURE_DATA_COUNTS (ListWalker) && DelType == Delete_Signature_Data) {\r
       NewCertList = (EFI_SIGNATURE_LIST *)(NewVariableData + Offset);\r
       //\r
       // Copy header.\r
       //\r
-      CopyMem ((UINT8 *)NewVariableData, ListWalker, sizeof (EFI_SIGNATURE_LIST) + ListWalker->SignatureHeaderSize);\r
+      CopyMem ((UINT8 *)NewVariableData + Offset, 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
@@ -3188,10 +3172,11 @@ DeleteSignatureEx (
         }\r
         DataWalker = (EFI_SIGNATURE_DATA *)((UINT8 *)DataWalker + ListWalker->SignatureSize);\r
       }\r
-\r
-      RemainingSize -= ListWalker->SignatureListSize;\r
     }\r
 \r
+    RemainingSize -= ListWalker->SignatureListSize;\r
+    ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);\r
+\r
     //\r
     // Copy remaining data, maybe 0.\r
     //\r
@@ -3222,7 +3207,6 @@ DeleteSignatureEx (
   }\r
 \r
 ON_EXIT:\r
-  SECUREBOOT_FREE_NON_NULL (VariableName);\r
   SECUREBOOT_FREE_NON_NULL (VariableData);\r
   SECUREBOOT_FREE_NON_NULL (NewVariableData);\r
 \r
@@ -3328,12 +3312,12 @@ SecureBootExtractConfigFromVariable (
   }\r
 \r
   //\r
-  // Check SecureBootEnable & Pk status, fix the inconsistence. \r
+  // Check SecureBootEnable & Pk status, fix the inconsistence.\r
   // If the SecureBootEnable Variable doesn't exist, hide the SecureBoot Enable/Disable\r
   // Checkbox.\r
   //\r
   ConfigData->AttemptSecureBoot = FALSE;\r
-  GetVariable2 (EFI_SECURE_BOOT_ENABLE_NAME, &gEfiSecureBootEnableDisableGuid, (VOID**)&SecureBootEnable, NULL);  \r
+  GetVariable2 (EFI_SECURE_BOOT_ENABLE_NAME, &gEfiSecureBootEnableDisableGuid, (VOID**)&SecureBootEnable, NULL);\r
 \r
   //\r
   // Fix Pk, SecureBootEnable inconsistence\r
@@ -3580,6 +3564,9 @@ LoadSignatureList (
 {\r
   EFI_STATUS            Status;\r
   EFI_STRING_ID         ListType;\r
+  EFI_STRING            FormatNameString;\r
+  EFI_STRING            FormatHelpString;\r
+  EFI_STRING            FormatTypeString;\r
   EFI_SIGNATURE_LIST    *ListWalker;\r
   EFI_IFR_GUID_LABEL    *StartLabel;\r
   EFI_IFR_GUID_LABEL    *EndLabel;\r
@@ -3594,20 +3581,19 @@ LoadSignatureList (
   UINTN                 RemainingSize;\r
   UINT16                Index;\r
   UINT8                 *VariableData;\r
-  CHAR16                *VariableName;\r
-  CHAR16                *NameBuffer;\r
-  CHAR16                *HelpBuffer;\r
+  CHAR16                VariableName[BUFFER_MAX_SIZE];\r
+  CHAR16                NameBuffer[BUFFER_MAX_SIZE];\r
+  CHAR16                HelpBuffer[BUFFER_MAX_SIZE];\r
 \r
   Status                = EFI_SUCCESS;\r
+  FormatNameString      = NULL;\r
+  FormatHelpString      = NULL;\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
@@ -3675,20 +3661,14 @@ LoadSignatureList (
   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
+  if (PrivateData->VariableName == Variable_DB) {\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), 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
+  } else if (PrivateData->VariableName == Variable_DBX) {\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), 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
+  } else if (PrivateData->VariableName == Variable_DBT) {\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE2);\r
     DstFormId = FORMID_SECURE_BOOT_DBT_OPTION_FORM;\r
   } else {\r
     goto ON_EXIT;\r
@@ -3722,15 +3702,9 @@ LoadSignatureList (
     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
+  FormatNameString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_NAME_FORMAT), NULL);\r
+  FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_HELP_FORMAT), NULL);\r
+  if (FormatNameString == NULL || FormatHelpString == NULL) {\r
     goto ON_EXIT;\r
   }\r
 \r
@@ -3754,18 +3728,23 @@ LoadSignatureList (
     } else {\r
       ListType = STRING_TOKEN (STR_LIST_TYPE_UNKNOWN);\r
     }\r
+    FormatTypeString = HiiGetString (PrivateData->HiiHandle, ListType, NULL);\r
+    if (FormatTypeString == NULL) {\r
+      goto ON_EXIT;\r
+    }\r
 \r
-    UnicodeSPrint (NameBuffer,\r
-      100,\r
-      HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_NAME_FORMAT), NULL),\r
-      Index + 1\r
-    );\r
+    ZeroMem (NameBuffer, sizeof (NameBuffer));\r
+    UnicodeSPrint (NameBuffer, sizeof (NameBuffer), FormatNameString, Index + 1);\r
+\r
+    ZeroMem (HelpBuffer, sizeof (HelpBuffer));\r
     UnicodeSPrint (HelpBuffer,\r
-      100,\r
-      HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_LIST_HELP_FORMAT), NULL),\r
-      HiiGetString (PrivateData->HiiHandle, ListType, NULL),\r
+      sizeof (HelpBuffer),\r
+      FormatHelpString,\r
+      FormatTypeString,\r
       SIGNATURE_DATA_COUNTS (ListWalker)\r
     );\r
+    SECUREBOOT_FREE_NON_NULL (FormatTypeString);\r
+    FormatTypeString = NULL;\r
 \r
     HiiCreateGotoOpCode (\r
       StartOpCodeHandle,\r
@@ -3776,9 +3755,6 @@ LoadSignatureList (
       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
@@ -3805,10 +3781,9 @@ ON_EXIT:
   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
+  SECUREBOOT_FREE_NON_NULL (FormatNameString);\r
+  SECUREBOOT_FREE_NON_NULL (FormatHelpString);\r
 \r
   PrivateData->ListCount = Index;\r
 \r
@@ -3954,23 +3929,24 @@ FormatHelpInfo (
   EFI_STATUS      Status;\r
   EFI_TIME        *Time;\r
   EFI_STRING_ID   ListTypeId;\r
+  EFI_STRING      FormatHelpString;\r
+  EFI_STRING      FormatTypeString;\r
   UINTN           DataSize;\r
   UINTN           HelpInfoIndex;\r
   UINTN           TotalSize;\r
-  CHAR16          *GuidString;\r
+  CHAR16          GuidString[BUFFER_MAX_SIZE];\r
+  CHAR16          TimeString[BUFFER_MAX_SIZE];\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
+  Status            = EFI_SUCCESS;\r
+  Time              = NULL;\r
+  FormatTypeString  = NULL;\r
+  HelpInfoIndex     = 0;\r
+  DataString        = NULL;\r
+  HelpInfoString    = NULL;\r
+  IsCert            = FALSE;\r
 \r
   if (CompareGuid(&ListEntry->SignatureType, &gEfiCertRsa2048Guid)) {\r
     ListTypeId = STRING_TOKEN(STR_LIST_TYPE_RSA2048_SHA256);\r
@@ -4003,9 +3979,8 @@ FormatHelpInfo (
     goto ON_EXIT;\r
   }\r
 \r
-  GuidString = AllocateZeroPool (100);\r
-  if (GuidString == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
+  FormatTypeString = HiiGetString (PrivateData->HiiHandle, ListTypeId, NULL);\r
+  if (FormatTypeString == NULL) {\r
     goto ON_EXIT;\r
   }\r
 \r
@@ -4019,55 +3994,56 @@ FormatHelpInfo (
   //\r
   // Format GUID part.\r
   //\r
-  GuidToString(&DataEntry->SignatureOwner, GuidString, 100);\r
+  ZeroMem (GuidString, sizeof (GuidString));\r
+  GuidToString(&DataEntry->SignatureOwner, GuidString, BUFFER_MAX_SIZE);\r
+  FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_GUID), NULL);\r
+  if (FormatHelpString == NULL) {\r
+    goto ON_EXIT;\r
+  }\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
+                     FormatHelpString,\r
                      GuidString\r
                    );\r
+  SECUREBOOT_FREE_NON_NULL (FormatHelpString);\r
+  FormatHelpString = NULL;\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
+    FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_CN), NULL);\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
+    FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_HASH), NULL);\r
   }\r
+  if (FormatHelpString == NULL) {\r
+    goto ON_EXIT;\r
+  }\r
+  HelpInfoIndex += UnicodeSPrint (\r
+                     &HelpInfoString[HelpInfoIndex],\r
+                     TotalSize - sizeof (CHAR16) * HelpInfoIndex,\r
+                     FormatHelpString,\r
+                     FormatTypeString,\r
+                     DataSize,\r
+                     DataString\r
+                   );\r
+  SECUREBOOT_FREE_NON_NULL (FormatHelpString);\r
+  FormatHelpString = NULL;\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
+    ZeroMem (TimeString, sizeof (TimeString));\r
     UnicodeSPrint (\r
       TimeString,\r
-      100,\r
+      sizeof (TimeString),\r
       L"%d-%d-%d %d:%d:%d",\r
       Time->Year,\r
       Time->Month,\r
@@ -4076,23 +4052,27 @@ FormatHelpInfo (
       Time->Minute,\r
       Time->Second\r
     );\r
-\r
+    FormatHelpString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_HELP_FORMAT_TIME), NULL);\r
+    if (FormatHelpString == NULL) {\r
+      goto ON_EXIT;\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
+      FormatHelpString,\r
       TimeString\r
     );\r
+    SECUREBOOT_FREE_NON_NULL (FormatHelpString);\r
+    FormatHelpString = NULL;\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
+  SECUREBOOT_FREE_NON_NULL (FormatTypeString);\r
+\r
   return Status;\r
 }\r
 \r
@@ -4123,22 +4103,22 @@ LoadSignatureData (
   EFI_IFR_GUID_LABEL    *StartLabel;\r
   EFI_IFR_GUID_LABEL    *EndLabel;\r
   EFI_STRING_ID         HelpStringId;\r
+  EFI_STRING            FormatNameString;\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
+  CHAR16                VariableName[BUFFER_MAX_SIZE];\r
+  CHAR16                NameBuffer[BUFFER_MAX_SIZE];\r
 \r
   Status              = EFI_SUCCESS;\r
+  FormatNameString    = NULL;\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
@@ -4176,18 +4156,12 @@ LoadSignatureData (
   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
+  if (PrivateData->VariableName == Variable_DB) {\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE);\r
+  } else if (PrivateData->VariableName == Variable_DBX) {\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE1);\r
+  } else if (PrivateData->VariableName == Variable_DBT) {\r
+    UnicodeSPrint (VariableName, sizeof (VariableName), EFI_IMAGE_SECURITY_DATABASE2);\r
   } else {\r
     goto ON_EXIT;\r
   }\r
@@ -4211,12 +4185,6 @@ LoadSignatureData (
     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
@@ -4228,16 +4196,18 @@ LoadSignatureData (
     ListWalker = (EFI_SIGNATURE_LIST *)((UINT8 *)ListWalker + ListWalker->SignatureListSize);\r
   }\r
 \r
+  FormatNameString = HiiGetString (PrivateData->HiiHandle, STRING_TOKEN (STR_SIGNATURE_DATA_NAME_FORMAT), NULL);\r
+  if (FormatNameString == NULL) {\r
+    goto ON_EXIT;\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
+    ZeroMem (NameBuffer, sizeof (NameBuffer));\r
+    UnicodeSPrint (NameBuffer, sizeof (NameBuffer), FormatNameString, Index + 1);\r
 \r
     //\r
     // Format help info buffer.\r
@@ -4268,7 +4238,6 @@ LoadSignatureData (
   // 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
@@ -4281,9 +4250,8 @@ ON_EXIT:
   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
+  SECUREBOOT_FREE_NON_NULL (FormatNameString);\r
 \r
   return Status;\r
 }\r
@@ -4337,6 +4305,7 @@ SecureBootCallback (
   UINTN                           NameLength;\r
   UINT16                          *FilePostFix;\r
   SECUREBOOT_CONFIG_PRIVATE_DATA  *PrivateData;\r
+  BOOLEAN                         GetBrowserDataResult;\r
 \r
   Status           = EFI_SUCCESS;\r
   SecureBootEnable = NULL;\r
@@ -4361,7 +4330,7 @@ SecureBootCallback (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  HiiGetBrowserData (&gSecureBootConfigFormSetGuid, mSecureBootStorageName, BufferSize, (UINT8 *) IfrNvData);\r
+  GetBrowserDataResult = HiiGetBrowserData (&gSecureBootConfigFormSetGuid, mSecureBootStorageName, BufferSize, (UINT8 *) IfrNvData);\r
 \r
   if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
     if (QuestionId == KEY_SECURE_BOOT_MODE) {\r
@@ -4401,7 +4370,7 @@ SecureBootCallback (
         Value->u8 = SECURE_BOOT_MODE_STANDARD;\r
         Status = EFI_SUCCESS;\r
       }\r
-    } \r
+    }\r
     goto EXIT;\r
   }\r
 \r
@@ -4584,7 +4553,7 @@ SecureBootCallback (
     // 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
+      Private->VariableName = Variable_DBX;\r
       LoadSignatureList (\r
         Private,\r
         LABEL_SIGNATURE_LIST_START,\r
@@ -4606,7 +4575,7 @@ SecureBootCallback (
       );\r
 \r
       if (Key.UnicodeChar == L'Y' || Key.UnicodeChar == L'y') {\r
-        DeleteSignatureEx (Private, DELETE_SIGNATURE_LIST_ALL, IfrNvData->CheckedDataCount);\r
+        DeleteSignatureEx (Private, Delete_Signature_List_All, IfrNvData->CheckedDataCount);\r
       }\r
 \r
       LoadSignatureList (\r
@@ -4630,7 +4599,7 @@ SecureBootCallback (
       );\r
 \r
       if (Key.UnicodeChar == L'Y' || Key.UnicodeChar == L'y') {\r
-        DeleteSignatureEx (Private, DELETE_SIGNATURE_LIST_ONE, IfrNvData->CheckedDataCount);\r
+        DeleteSignatureEx (Private, Delete_Signature_List_One, IfrNvData->CheckedDataCount);\r
       }\r
 \r
       LoadSignatureList (\r
@@ -4654,7 +4623,7 @@ SecureBootCallback (
       );\r
 \r
       if (Key.UnicodeChar == L'Y' || Key.UnicodeChar == L'y') {\r
-        DeleteSignatureEx (Private, DELETE_SIGNATURE_DATA, IfrNvData->CheckedDataCount);\r
+        DeleteSignatureEx (Private, Delete_Signature_Data, IfrNvData->CheckedDataCount);\r
       }\r
 \r
       LoadSignatureList (\r
@@ -4907,7 +4876,7 @@ SecureBootCallback (
 \r
 EXIT:\r
 \r
-  if (!EFI_ERROR (Status)) {\r
+  if (!EFI_ERROR (Status) && GetBrowserDataResult) {\r
     BufferSize = sizeof (SECUREBOOT_CONFIGURATION);\r
     HiiSetBrowserData (&gSecureBootConfigFormSetGuid, mSecureBootStorageName, BufferSize, (UINT8*) IfrNvData, NULL);\r
   }\r