]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c
SecurityPkg OpalPassword: Add solution without SMM device code
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPasswordDxe / OpalHii.c
index 5e3106acf6b0700a6b9fdb40a1f49c75cb9c2cef..e3bde4275dfa73a9be861fb41fe6e5e653b7a7d5 100644 (file)
@@ -98,9 +98,9 @@ HiiSetCurrentConfiguration(
   //\r
   // Update the BlockSID status string.\r
   //\r
-  PpStorageFlag = TcgPhysicalPresenceStorageLibReturnStorageFlags();\r
+  PpStorageFlag = Tcg2PhysicalPresenceLibGetManagementFlags ();\r
 \r
-  if ((PpStorageFlag & TCG_BIOS_STORAGE_MANAGEMENT_FLAG_ENABLE_BLOCK_SID) != 0) {\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
@@ -116,7 +116,7 @@ HiiSetCurrentConfiguration(
   HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS1), NewString, NULL);\r
   FreePool (NewString);\r
 \r
-  if ((PpStorageFlag & TCG_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_ENABLE_BLOCK_SID) != 0) {\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
@@ -132,7 +132,7 @@ HiiSetCurrentConfiguration(
   HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS2), NewString, NULL);\r
   FreePool (NewString);\r
 \r
-  if ((PpStorageFlag & TCG_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_DISABLE_BLOCK_SID) != 0) {\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
@@ -501,14 +501,13 @@ 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
         switch (Value->u8) {\r
           case 0:\r
@@ -661,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
@@ -674,15 +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
+  UnicodeStr = HiiGetString (gHiiPackageListHandle, PsidStringId, NULL);\r
   ZeroMem (TmpBuf, sizeof (TmpBuf));\r
-  UnicodeStrToAsciiStrS (gHiiConfiguration.Psid, (CHAR8*)TmpBuf, PSID_CHARACTER_STRING_END_LENGTH);\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
@@ -694,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
@@ -1099,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
@@ -1124,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
@@ -1154,15 +1166,17 @@ 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
@@ -1176,11 +1190,7 @@ HiiSetBlockSidAction (
   UINT32                           ReturnCode;\r
   EFI_STATUS                       Status;\r
 \r
-  //\r
-  // Process TCG Physical Presence request just after trusted console is ready\r
-  // Platform can connect trusted consoles and then call the below function.\r
-  //\r
-  ReturnCode = TcgPhysicalPresenceStorageLibSubmitRequestToPreOSFunction (PpRequest, 0);\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
@@ -1270,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
@@ -1284,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