]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/Tpm2CommandLib/Tpm2Miscellaneous.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / SecurityPkg / Library / Tpm2CommandLib / Tpm2Miscellaneous.c
CommitLineData
c1d93242 1/** @file\r
f9fd0c21 2 Implement TPM2 Miscellaneous related command.\r
c1d93242 3\r
7ae130da 4Copyright (c) 2013 - 2016, Intel Corporation. All rights reserved. <BR>\r
289b714b 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
c1d93242
JY
6\r
7**/\r
8\r
9#include <IndustryStandard/UefiTcgPlatform.h>\r
10#include <Library/Tpm2CommandLib.h>\r
11#include <Library/Tpm2DeviceLib.h>\r
12#include <Library/BaseMemoryLib.h>\r
13#include <Library/BaseLib.h>\r
14#include <Library/DebugLib.h>\r
15\r
16#pragma pack(1)\r
17\r
18typedef struct {\r
19 TPM2_COMMAND_HEADER Header;\r
20 TPMI_RH_HIERARCHY_AUTH AuthHandle;\r
21 UINT32 AuthSessionSize;\r
22 TPMS_AUTH_COMMAND AuthSession;\r
23 UINT32 AlgorithmSet;\r
24} TPM2_SET_ALGORITHM_SET_COMMAND;\r
25\r
26typedef struct {\r
c411b485
MK
27 TPM2_RESPONSE_HEADER Header;\r
28 UINT32 AuthSessionSize;\r
29 TPMS_AUTH_RESPONSE AuthSession;\r
c1d93242
JY
30} TPM2_SET_ALGORITHM_SET_RESPONSE;\r
31\r
32#pragma pack()\r
33\r
34/**\r
35 This command allows the platform to change the set of algorithms that are used by the TPM.\r
36 The algorithmSet setting is a vendor-dependent value.\r
37\r
38 @param[in] AuthHandle TPM_RH_PLATFORM\r
39 @param[in] AuthSession Auth Session context\r
40 @param[in] AlgorithmSet A TPM vendor-dependent value indicating the\r
41 algorithm set selection\r
42\r
43 @retval EFI_SUCCESS Operation completed successfully.\r
44 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
45**/\r
46EFI_STATUS\r
47EFIAPI\r
48Tpm2SetAlgorithmSet (\r
c411b485
MK
49 IN TPMI_RH_PLATFORM AuthHandle,\r
50 IN TPMS_AUTH_COMMAND *AuthSession,\r
51 IN UINT32 AlgorithmSet\r
c1d93242
JY
52 )\r
53{\r
c411b485
MK
54 EFI_STATUS Status;\r
55 TPM2_SET_ALGORITHM_SET_COMMAND SendBuffer;\r
56 TPM2_SET_ALGORITHM_SET_RESPONSE RecvBuffer;\r
57 UINT32 SendBufferSize;\r
58 UINT32 RecvBufferSize;\r
59 UINT8 *Buffer;\r
60 UINT32 SessionInfoSize;\r
c1d93242
JY
61\r
62 //\r
63 // Construct command\r
64 //\r
c411b485
MK
65 SendBuffer.Header.tag = SwapBytes16 (TPM_ST_SESSIONS);\r
66 SendBuffer.Header.commandCode = SwapBytes32 (TPM_CC_SetAlgorithmSet);\r
c1d93242
JY
67\r
68 SendBuffer.AuthHandle = SwapBytes32 (AuthHandle);\r
69\r
70 //\r
71 // Add in Auth session\r
72 //\r
73 Buffer = (UINT8 *)&SendBuffer.AuthSession;\r
74\r
75 // sessionInfoSize\r
c411b485
MK
76 SessionInfoSize = CopyAuthSessionCommand (AuthSession, Buffer);\r
77 Buffer += SessionInfoSize;\r
78 SendBuffer.AuthSessionSize = SwapBytes32 (SessionInfoSize);\r
c1d93242
JY
79\r
80 //\r
81 // Real data\r
82 //\r
c411b485
MK
83 WriteUnaligned32 ((UINT32 *)Buffer, SwapBytes32 (AlgorithmSet));\r
84 Buffer += sizeof (UINT32);\r
c1d93242 85\r
c411b485 86 SendBufferSize = (UINT32)((UINTN)Buffer - (UINTN)&SendBuffer);\r
c1d93242
JY
87 SendBuffer.Header.paramSize = SwapBytes32 (SendBufferSize);\r
88\r
89 //\r
90 // send Tpm command\r
91 //\r
92 RecvBufferSize = sizeof (RecvBuffer);\r
c411b485 93 Status = Tpm2SubmitCommand (SendBufferSize, (UINT8 *)&SendBuffer, &RecvBufferSize, (UINT8 *)&RecvBuffer);\r
c1d93242 94 if (EFI_ERROR (Status)) {\r
7ae130da 95 goto Done;\r
c1d93242
JY
96 }\r
97\r
98 if (RecvBufferSize < sizeof (TPM2_RESPONSE_HEADER)) {\r
e905fbb0 99 DEBUG ((DEBUG_ERROR, "Tpm2SetAlgorithmSet - RecvBufferSize Error - %x\n", RecvBufferSize));\r
7ae130da
JY
100 Status = EFI_DEVICE_ERROR;\r
101 goto Done;\r
c1d93242 102 }\r
c411b485
MK
103\r
104 if (SwapBytes32 (RecvBuffer.Header.responseCode) != TPM_RC_SUCCESS) {\r
105 DEBUG ((DEBUG_ERROR, "Tpm2SetAlgorithmSet - responseCode - %x\n", SwapBytes32 (RecvBuffer.Header.responseCode)));\r
7ae130da
JY
106 Status = EFI_DEVICE_ERROR;\r
107 goto Done;\r
c1d93242
JY
108 }\r
109\r
7ae130da
JY
110Done:\r
111 //\r
112 // Clear AuthSession Content\r
113 //\r
c411b485
MK
114 ZeroMem (&SendBuffer, sizeof (SendBuffer));\r
115 ZeroMem (&RecvBuffer, sizeof (RecvBuffer));\r
7ae130da 116 return Status;\r
c1d93242 117}\r