]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/Tpm2CommandLib/Tpm2Miscellaneous.c
SecurityPkg: Clear AuthSession content after use.
[mirror_edk2.git] / SecurityPkg / Library / Tpm2CommandLib / Tpm2Miscellaneous.c
CommitLineData
c1d93242
JY
1/** @file\r
2 Implement TPM2 Miscellanenous related command.\r
3\r
7ae130da 4Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>\r
c1d93242
JY
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include <IndustryStandard/UefiTcgPlatform.h>\r
16#include <Library/Tpm2CommandLib.h>\r
17#include <Library/Tpm2DeviceLib.h>\r
18#include <Library/BaseMemoryLib.h>\r
19#include <Library/BaseLib.h>\r
20#include <Library/DebugLib.h>\r
21\r
22#pragma pack(1)\r
23\r
24typedef struct {\r
25 TPM2_COMMAND_HEADER Header;\r
26 TPMI_RH_HIERARCHY_AUTH AuthHandle;\r
27 UINT32 AuthSessionSize;\r
28 TPMS_AUTH_COMMAND AuthSession;\r
29 UINT32 AlgorithmSet;\r
30} TPM2_SET_ALGORITHM_SET_COMMAND;\r
31\r
32typedef struct {\r
33 TPM2_RESPONSE_HEADER Header;\r
34 UINT32 AuthSessionSize;\r
35 TPMS_AUTH_RESPONSE AuthSession;\r
36} TPM2_SET_ALGORITHM_SET_RESPONSE;\r
37\r
38#pragma pack()\r
39\r
40/**\r
41 This command allows the platform to change the set of algorithms that are used by the TPM.\r
42 The algorithmSet setting is a vendor-dependent value.\r
43\r
44 @param[in] AuthHandle TPM_RH_PLATFORM\r
45 @param[in] AuthSession Auth Session context\r
46 @param[in] AlgorithmSet A TPM vendor-dependent value indicating the\r
47 algorithm set selection\r
48\r
49 @retval EFI_SUCCESS Operation completed successfully.\r
50 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
51**/\r
52EFI_STATUS\r
53EFIAPI\r
54Tpm2SetAlgorithmSet (\r
55 IN TPMI_RH_PLATFORM AuthHandle,\r
56 IN TPMS_AUTH_COMMAND *AuthSession,\r
57 IN UINT32 AlgorithmSet\r
58 )\r
59{\r
60 EFI_STATUS Status;\r
61 TPM2_SET_ALGORITHM_SET_COMMAND SendBuffer;\r
62 TPM2_SET_ALGORITHM_SET_RESPONSE RecvBuffer;\r
63 UINT32 SendBufferSize;\r
64 UINT32 RecvBufferSize;\r
65 UINT8 *Buffer;\r
66 UINT32 SessionInfoSize;\r
67\r
68 //\r
69 // Construct command\r
70 //\r
71 SendBuffer.Header.tag = SwapBytes16(TPM_ST_SESSIONS);\r
72 SendBuffer.Header.commandCode = SwapBytes32(TPM_CC_SetAlgorithmSet);\r
73\r
74 SendBuffer.AuthHandle = SwapBytes32 (AuthHandle);\r
75\r
76 //\r
77 // Add in Auth session\r
78 //\r
79 Buffer = (UINT8 *)&SendBuffer.AuthSession;\r
80\r
81 // sessionInfoSize\r
82 SessionInfoSize = CopyAuthSessionCommand (AuthSession, Buffer);\r
83 Buffer += SessionInfoSize;\r
84 SendBuffer.AuthSessionSize = SwapBytes32(SessionInfoSize);\r
85\r
86 //\r
87 // Real data\r
88 //\r
89 WriteUnaligned32 ((UINT32 *)Buffer, SwapBytes32(AlgorithmSet));\r
90 Buffer += sizeof(UINT32);\r
91\r
92 SendBufferSize = (UINT32)((UINTN)Buffer - (UINTN)&SendBuffer);\r
93 SendBuffer.Header.paramSize = SwapBytes32 (SendBufferSize);\r
94\r
95 //\r
96 // send Tpm command\r
97 //\r
98 RecvBufferSize = sizeof (RecvBuffer);\r
99 Status = Tpm2SubmitCommand (SendBufferSize, (UINT8 *)&SendBuffer, &RecvBufferSize, (UINT8 *)&RecvBuffer);\r
100 if (EFI_ERROR (Status)) {\r
7ae130da 101 goto Done;\r
c1d93242
JY
102 }\r
103\r
104 if (RecvBufferSize < sizeof (TPM2_RESPONSE_HEADER)) {\r
105 DEBUG ((EFI_D_ERROR, "Tpm2SetAlgorithmSet - RecvBufferSize Error - %x\n", RecvBufferSize));\r
7ae130da
JY
106 Status = EFI_DEVICE_ERROR;\r
107 goto Done;\r
c1d93242
JY
108 }\r
109 if (SwapBytes32(RecvBuffer.Header.responseCode) != TPM_RC_SUCCESS) {\r
110 DEBUG ((EFI_D_ERROR, "Tpm2SetAlgorithmSet - responseCode - %x\n", SwapBytes32(RecvBuffer.Header.responseCode)));\r
7ae130da
JY
111 Status = EFI_DEVICE_ERROR;\r
112 goto Done;\r
c1d93242
JY
113 }\r
114\r
7ae130da
JY
115Done:\r
116 //\r
117 // Clear AuthSession Content\r
118 //\r
119 ZeroMem (&SendBuffer, sizeof(SendBuffer));\r
120 ZeroMem (&RecvBuffer, sizeof(RecvBuffer));\r
121 return Status;\r
c1d93242 122}\r