]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c
Security/OpalHii.c: Handle NULL Request or Request with no elements
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPasswordDxe / OpalHii.c
index 9a44c5697e8e0d8ebea5fabe9c4d6e06f3708216..e3bde4275dfa73a9be861fb41fe6e5e653b7a7d5 100644 (file)
@@ -90,23 +90,63 @@ HiiSetCurrentConfiguration(
   VOID\r
   )\r
 {\r
-  EFI_STATUS                            Status;\r
-  OPAL_EXTRA_INFO_VAR                   OpalExtraInfo;\r
-  UINTN                                 DataSize;\r
+  UINT32                                       PpStorageFlag;\r
+  EFI_STRING                                   NewString;\r
 \r
   gHiiConfiguration.NumDisks = GetDeviceCount();\r
 \r
-  DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
-  Status = gRT->GetVariable (\r
-                  OPAL_EXTRA_INFO_VAR_NAME,\r
-                  &gOpalExtraInfoVariableGuid,\r
-                  NULL,\r
-                  &DataSize,\r
-                  &OpalExtraInfo\r
-                  );\r
-  if (!EFI_ERROR (Status)) {\r
-    gHiiConfiguration.EnableBlockSid = OpalExtraInfo.EnableBlockSid;\r
+  //\r
+  // Update the BlockSID status string.\r
+  //\r
+  PpStorageFlag = Tcg2PhysicalPresenceLibGetManagementFlags ();\r
+\r
+  if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_ENABLE_BLOCK_SID) != 0) {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_ENABLED), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
+  } else {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISABLED), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
   }\r
+  HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS1), NewString, NULL);\r
+  FreePool (NewString);\r
+\r
+  if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_ENABLE_BLOCK_SID) != 0) {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_TRUE), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
+  } else {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_FALSE), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
+  }\r
+  HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS2), NewString, NULL);\r
+  FreePool (NewString);\r
+\r
+  if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_DISABLE_BLOCK_SID) != 0) {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_TRUE), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
+  } else {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_FALSE), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
+  }\r
+  HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS3), NewString, NULL);\r
+  FreePool (NewString);\r
 }\r
 \r
 /**\r
@@ -400,6 +440,7 @@ DriverCallback(
 {\r
   HII_KEY    HiiKey;\r
   UINT8      HiiKeyId;\r
+  UINT32     PpRequest;\r
 \r
   if (ActionRequest != NULL) {\r
     *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
@@ -460,18 +501,55 @@ DriverCallback(
 \r
       case HII_KEY_ID_ENTER_PASSWORD:\r
         return HiiPasswordEntered(Value->string);\r
+\r
+      case HII_KEY_ID_ENTER_PSID:\r
+        return HiiPsidRevert(Value->string);\r
+\r
     }\r
   } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
     switch (HiiKeyId) {\r
-      case HII_KEY_ID_ENTER_PSID:\r
-        HiiPsidRevert();\r
-        *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
-        return EFI_SUCCESS;\r
-\r
       case HII_KEY_ID_BLOCKSID:\r
-        HiiSetBlockSid(Value->b);\r
+        switch (Value->u8) {\r
+          case 0:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
+            break;\r
+\r
+          case 1:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID;\r
+            break;\r
+\r
+          case 2:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID;\r
+            break;\r
+\r
+          case 3:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_TRUE;\r
+            break;\r
+\r
+          case 4:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_FALSE;\r
+            break;\r
+\r
+          case 5:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_TRUE;\r
+            break;\r
+\r
+          case 6:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_FALSE;\r
+            break;\r
+\r
+          default:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
+            DEBUG ((DEBUG_ERROR, "Invalid value input!\n"));\r
+            break;\r
+        }\r
+        HiiSetBlockSidAction(PpRequest);\r
+\r
         *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
         return EFI_SUCCESS;\r
+\r
+      default:\r
+        break;\r
     }\r
   }\r
 \r
@@ -582,12 +660,14 @@ HiiPopulateDiskInfoForm(
 /**\r
   Reverts the Opal disk to factory default.\r
 \r
+  @param   PsidStringId      The string id for the PSID info.\r
+\r
   @retval  EFI_SUCCESS       Do the required action success.\r
 \r
 **/\r
 EFI_STATUS\r
 HiiPsidRevert(\r
-  VOID\r
+  EFI_STRING_ID         PsidStringId\r
   )\r
 {\r
   CHAR8                         Response[DEFAULT_RESPONSE_SIZE];\r
@@ -595,12 +675,19 @@ HiiPsidRevert(
   OPAL_DISK                     *OpalDisk;\r
   TCG_RESULT                    Ret;\r
   OPAL_SESSION                  Session;\r
+  CHAR16                        *UnicodeStr;\r
+  UINT8                         TmpBuf[PSID_CHARACTER_STRING_END_LENGTH];\r
 \r
   Ret = TcgResultFailure;\r
 \r
-  OpalHiiGetBrowserData();\r
-\r
-  UnicodeStrToAsciiStrS (gHiiConfiguration.Psid, (CHAR8*)Psid.Psid, PSID_CHARACTER_LENGTH);\r
+  UnicodeStr = HiiGetString (gHiiPackageListHandle, PsidStringId, NULL);\r
+  ZeroMem (TmpBuf, sizeof (TmpBuf));\r
+  UnicodeStrToAsciiStrS (UnicodeStr, (CHAR8*)TmpBuf, PSID_CHARACTER_STRING_END_LENGTH);\r
+  CopyMem (Psid.Psid, TmpBuf, PSID_CHARACTER_LENGTH);\r
+  HiiSetString (gHiiPackageListHandle, PsidStringId, L"", NULL);\r
+  ZeroMem (TmpBuf, sizeof (TmpBuf));\r
+  ZeroMem (UnicodeStr, StrSize (UnicodeStr));\r
+  FreePool (UnicodeStr);\r
 \r
   OpalDisk = HiiGetOpalDiskCB (gHiiConfiguration.SelectedDiskIndex);\r
   if (OpalDisk != NULL) {\r
@@ -612,6 +699,8 @@ HiiPsidRevert(
     Ret = OpalSupportPsidRevert(&Session, Psid.Psid, (UINT32)sizeof(Psid.Psid), OpalDisk->OpalDevicePath);\r
   }\r
 \r
+  ZeroMem (Psid.Psid, PSID_CHARACTER_LENGTH);\r
+\r
   if (Ret == TcgResultSuccess) {\r
     AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Success" );\r
   } else {\r
@@ -1017,8 +1106,8 @@ HiiPasswordEntered(
   EFI_STRING_ID            Str\r
   )\r
 {\r
-  OPAL_DISK*                    OpalDisk;\r
-  CHAR8                         Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
+  OPAL_DISK*                   OpalDisk;\r
+  CHAR8                        Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
   CHAR16*                      UniStr;\r
   UINT32                       PassLength;\r
   EFI_STATUS                   Status;\r
@@ -1042,15 +1131,20 @@ HiiPasswordEntered(
   if (UniStr == NULL) {\r
     return EFI_NOT_FOUND;\r
   }\r
+\r
+  HiiSetString(gHiiPackageListHandle, Str, L"", NULL);\r
+\r
   PassLength = (UINT32) StrLen (UniStr);\r
   if (PassLength >= sizeof(Password)) {\r
     HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Password too long");\r
-    gBS->FreePool(UniStr);\r
+    ZeroMem (UniStr, StrSize (UniStr));\r
+    FreePool(UniStr);\r
     return EFI_BUFFER_TOO_SMALL;\r
   }\r
 \r
   UnicodeStrToAsciiStrS (UniStr, Password, sizeof (Password));\r
-  gBS->FreePool(UniStr);\r
+  ZeroMem (UniStr, StrSize (UniStr));\r
+  FreePool(UniStr);\r
 \r
   if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_UNLOCK) {\r
     Status = HiiUnlock (OpalDisk, Password, PassLength);\r
@@ -1072,40 +1166,40 @@ HiiPasswordEntered(
     Status = HiiSetPassword(OpalDisk, Password, PassLength);\r
   }\r
 \r
+  ZeroMem (Password, sizeof (Password));\r
+\r
   OpalHiiSetBrowserData ();\r
 \r
   return Status;\r
 }\r
 \r
 /**\r
-  Update block sid info.\r
+  Send BlockSid request through TPM physical presence module.\r
 \r
-  @param      Enable         Enable/disable BlockSid.\r
+  @param   PpRequest         TPM physical presence operation request.\r
 \r
   @retval  EFI_SUCCESS       Do the required action success.\r
   @retval  Others            Other error occur.\r
 \r
 **/\r
 EFI_STATUS\r
-HiiSetBlockSid (\r
-  BOOLEAN          Enable\r
+HiiSetBlockSidAction (\r
+  IN UINT32          PpRequest\r
   )\r
 {\r
-  EFI_STATUS                            Status;\r
-  OPAL_EXTRA_INFO_VAR                   OpalExtraInfo;\r
-  UINTN                                 DataSize;\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  OpalExtraInfo.EnableBlockSid = Enable;\r
-  DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
-  Status = gRT->SetVariable (\r
-                 OPAL_EXTRA_INFO_VAR_NAME,\r
-                 &gOpalExtraInfoVariableGuid,\r
-                 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
-                 DataSize,\r
-                 &OpalExtraInfo\r
-                 );\r
+  UINT32                           ReturnCode;\r
+  EFI_STATUS                       Status;\r
+\r
+  ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
+  if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
+    Status = EFI_SUCCESS;\r
+  } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+  } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
+    Status = EFI_UNSUPPORTED;\r
+  } else {\r
+    Status = EFI_DEVICE_ERROR;\r
+  }\r
 \r
   return Status;\r
 }\r
@@ -1186,6 +1280,12 @@ ExtractConfig(
   )\r
 {\r
   EFI_STATUS                              Status;\r
+  EFI_STRING                              ConfigRequest;\r
+  EFI_STRING                              ConfigRequestHdr;\r
+  UINTN                                   BufferSize;\r
+  UINTN                                   Size;\r
+  BOOLEAN                                 AllocatedRequest;\r
+  EFI_HANDLE                              DriverHandle;\r
 \r
   //\r
   // Check for valid parameters\r
@@ -1200,18 +1300,56 @@ ExtractConfig(
     return EFI_NOT_FOUND;\r
   }\r
 \r
+  AllocatedRequest = FALSE;\r
+  BufferSize = sizeof (OPAL_HII_CONFIGURATION);\r
+  ConfigRequest = Request;\r
+  if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
+    //\r
+    // Request has no request element, construct full request string.\r
+    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
+    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
+    //\r
+    DriverHandle = HiiGetDriverImageHandleCB();\r
+    ConfigRequestHdr = HiiConstructConfigHdr (&gHiiSetupVariableGuid, OpalPasswordStorageName, DriverHandle);\r
+    Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
+    ConfigRequest = AllocateZeroPool (Size);\r
+    if (ConfigRequest == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    AllocatedRequest = TRUE;\r
+    UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
+    FreePool (ConfigRequestHdr);\r
+  }\r
+\r
   //\r
   // Convert Buffer Data to <ConfigResp> by helper function BlockToConfig( )\r
   //\r
   Status = gHiiConfigRouting->BlockToConfig(\r
                gHiiConfigRouting,\r
-               Request,\r
+               ConfigRequest,\r
                (UINT8*)&gHiiConfiguration,\r
                sizeof(OPAL_HII_CONFIGURATION),\r
                Results,\r
                Progress\r
            );\r
 \r
+  //\r
+  // Free the allocated config request string.\r
+  //\r
+  if (AllocatedRequest) {\r
+    FreePool (ConfigRequest);\r
+    ConfigRequest = NULL;\r
+  }\r
+\r
+  //\r
+  // Set Progress string to the original request string.\r
+  //\r
+  if (Request == NULL) {\r
+    *Progress = NULL;\r
+  } else if (StrStr (Request, L"OFFSET") == NULL) {\r
+    *Progress = Request + StrLen (Request);\r
+  }\r
+\r
   return (Status);\r
 }\r
 \r