]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Library/Tpm2CommandLib/Tpm2Hierarchy.c
SecurityPkg: Clear AuthSession content after use.
[mirror_edk2.git] / SecurityPkg / Library / Tpm2CommandLib / Tpm2Hierarchy.c
index 1c33c2de2a2079520d36f529381a572d844a928d..9bfbdad394c0aa9b80a22435ffdc7dff95c05e58 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Implement TPM2 Hierarchy related command.\r
 \r
-Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved. <BR>\r
+Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <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
@@ -23,7 +23,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 typedef struct {\r
   TPM2_COMMAND_HEADER       Header;\r
-  TPMI_RH_HIERARCHY         AuthHandle;\r
+  TPMI_RH_HIERARCHY_AUTH    AuthHandle;\r
   UINT32                    AuthSessionSize;\r
   TPMS_AUTH_COMMAND         AuthSession;\r
   TPM2B_DIGEST              AuthPolicy;\r
@@ -186,19 +186,27 @@ Tpm2SetPrimaryPolicy (
   RecvBufferSize = sizeof (RecvBuffer);\r
   Status = Tpm2SubmitCommand (SendBufferSize, (UINT8 *)&SendBuffer, &RecvBufferSize, (UINT8 *)&RecvBuffer);\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   if (RecvBufferSize < sizeof (TPM2_RESPONSE_HEADER)) {\r
     DEBUG ((EFI_D_ERROR, "Tpm2SetPrimaryPolicy - RecvBufferSize Error - %x\n", RecvBufferSize));\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
   if (SwapBytes32(RecvBuffer.Header.responseCode) != TPM_RC_SUCCESS) {\r
     DEBUG ((EFI_D_ERROR, "Tpm2SetPrimaryPolicy - responseCode - %x\n", SwapBytes32(RecvBuffer.Header.responseCode)));\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  //\r
+  // Clear AuthSession Content\r
+  //\r
+  ZeroMem (&SendBuffer, sizeof(SendBuffer));\r
+  ZeroMem (&RecvBuffer, sizeof(RecvBuffer));\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -246,12 +254,13 @@ Tpm2Clear (
   ResultBufSize = sizeof(Res);\r
   Status = Tpm2SubmitCommand (CmdSize, (UINT8 *)&Cmd, &ResultBufSize, (UINT8 *)&Res);\r
   if (EFI_ERROR(Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   if (ResultBufSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "Clear: Failed ExecuteCommand: Buffer Too Small\r\n"));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -260,7 +269,8 @@ Tpm2Clear (
   RespSize = SwapBytes32(Res.Header.paramSize);\r
   if (RespSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "Clear: Response size too large! %d\r\n", RespSize));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -268,7 +278,8 @@ Tpm2Clear (
   //\r
   if (SwapBytes32(Res.Header.responseCode) != TPM_RC_SUCCESS) {\r
     DEBUG ((EFI_D_ERROR, "Clear: Response Code error! 0x%08x\r\n", SwapBytes32(Res.Header.responseCode)));\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -276,8 +287,13 @@ Tpm2Clear (
   //\r
 \r
   // None\r
-\r
-  return EFI_SUCCESS;\r
+Done:\r
+  //\r
+  // Clear AuthSession Content\r
+  //\r
+  ZeroMem (&Cmd, sizeof(Cmd));\r
+  ZeroMem (&Res, sizeof(Res));\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -332,12 +348,13 @@ Tpm2ClearControl (
   ResultBufSize = sizeof(Res);\r
   Status = Tpm2SubmitCommand (CmdSize, (UINT8 *)&Cmd, &ResultBufSize, (UINT8 *)&Res);\r
   if (EFI_ERROR(Status)) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   if (ResultBufSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "ClearControl: Failed ExecuteCommand: Buffer Too Small\r\n"));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -346,7 +363,8 @@ Tpm2ClearControl (
   RespSize = SwapBytes32(Res.Header.paramSize);\r
   if (RespSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "ClearControl: Response size too large! %d\r\n", RespSize));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -354,7 +372,8 @@ Tpm2ClearControl (
   //\r
   if (SwapBytes32(Res.Header.responseCode) != TPM_RC_SUCCESS) {\r
     DEBUG ((EFI_D_ERROR, "ClearControl: Response Code error! 0x%08x\r\n", SwapBytes32(Res.Header.responseCode)));\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -362,8 +381,13 @@ Tpm2ClearControl (
   //\r
 \r
   // None\r
-\r
-  return EFI_SUCCESS;\r
+Done:\r
+  //\r
+  // Clear AuthSession Content\r
+  //\r
+  ZeroMem (&Cmd, sizeof(Cmd));\r
+  ZeroMem (&Res, sizeof(Res));\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -436,10 +460,14 @@ Tpm2HierarchyChangeAuth (
              &ResultBufSize,\r
              ResultBuf\r
              );\r
+  if (EFI_ERROR(Status)) {\r
+    goto Done;\r
+  }\r
 \r
   if (ResultBufSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "HierarchyChangeAuth: Failed ExecuteCommand: Buffer Too Small\r\n"));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -448,7 +476,8 @@ Tpm2HierarchyChangeAuth (
   RespSize = SwapBytes32(Res.Header.paramSize);\r
   if (RespSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "HierarchyChangeAuth: Response size too large! %d\r\n", RespSize));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -456,10 +485,17 @@ Tpm2HierarchyChangeAuth (
   //\r
   if (SwapBytes32(Res.Header.responseCode) != TPM_RC_SUCCESS) {\r
     DEBUG((EFI_D_ERROR,"HierarchyChangeAuth: Response Code error! 0x%08x\r\n", SwapBytes32(Res.Header.responseCode)));\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  //\r
+  // Clear AuthSession Content\r
+  //\r
+  ZeroMem (&Cmd, sizeof(Cmd));\r
+  ZeroMem (&Res, sizeof(Res));\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -522,10 +558,14 @@ Tpm2ChangeEPS (
              &ResultBufSize,\r
              ResultBuf\r
              );\r
+  if (EFI_ERROR(Status)) {\r
+    goto Done;\r
+  }\r
 \r
   if (ResultBufSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "ChangeEPS: Failed ExecuteCommand: Buffer Too Small\r\n"));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -534,7 +574,8 @@ Tpm2ChangeEPS (
   RespSize = SwapBytes32(Res.Header.paramSize);\r
   if (RespSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "ChangeEPS: Response size too large! %d\r\n", RespSize));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -542,10 +583,17 @@ Tpm2ChangeEPS (
   //\r
   if (SwapBytes32(Res.Header.responseCode) != TPM_RC_SUCCESS) {\r
     DEBUG((EFI_D_ERROR,"ChangeEPS: Response Code error! 0x%08x\r\n", SwapBytes32(Res.Header.responseCode)));\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  //\r
+  // Clear AuthSession Content\r
+  //\r
+  ZeroMem (&Cmd, sizeof(Cmd));\r
+  ZeroMem (&Res, sizeof(Res));\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -608,10 +656,14 @@ Tpm2ChangePPS (
              &ResultBufSize,\r
              ResultBuf\r
              );\r
+  if (EFI_ERROR(Status)) {\r
+    goto Done;\r
+  }\r
 \r
   if (ResultBufSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "ChangePPS: Failed ExecuteCommand: Buffer Too Small\r\n"));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -620,7 +672,8 @@ Tpm2ChangePPS (
   RespSize = SwapBytes32(Res.Header.paramSize);\r
   if (RespSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "ChangePPS: Response size too large! %d\r\n", RespSize));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -628,10 +681,17 @@ Tpm2ChangePPS (
   //\r
   if (SwapBytes32(Res.Header.responseCode) != TPM_RC_SUCCESS) {\r
     DEBUG((EFI_D_ERROR,"ChangePPS: Response Code error! 0x%08x\r\n", SwapBytes32(Res.Header.responseCode)));\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  //\r
+  // Clear AuthSession Content\r
+  //\r
+  ZeroMem (&Cmd, sizeof(Cmd));\r
+  ZeroMem (&Res, sizeof(Res));\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -704,10 +764,14 @@ Tpm2HierarchyControl (
              &ResultBufSize,\r
              ResultBuf\r
              );\r
+  if (EFI_ERROR(Status)) {\r
+    goto Done;\r
+  }\r
 \r
   if (ResultBufSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "HierarchyControl: Failed ExecuteCommand: Buffer Too Small\r\n"));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -716,7 +780,8 @@ Tpm2HierarchyControl (
   RespSize = SwapBytes32(Res.Header.paramSize);\r
   if (RespSize > sizeof(Res)) {\r
     DEBUG ((EFI_D_ERROR, "HierarchyControl: Response size too large! %d\r\n", RespSize));\r
-    return EFI_BUFFER_TOO_SMALL;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
   }\r
 \r
   //\r
@@ -724,8 +789,15 @@ Tpm2HierarchyControl (
   //\r
   if (SwapBytes32(Res.Header.responseCode) != TPM_RC_SUCCESS) {\r
     DEBUG((EFI_D_ERROR,"HierarchyControl: Response Code error! 0x%08x\r\n", SwapBytes32(Res.Header.responseCode)));\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  //\r
+  // Clear AuthSession Content\r
+  //\r
+  ZeroMem (&Cmd, sizeof(Cmd));\r
+  ZeroMem (&Res, sizeof(Res));\r
+  return Status;\r
 }\r