]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/Tpm12CommandLib/Tpm12NvStorage.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / SecurityPkg / Library / Tpm12CommandLib / Tpm12NvStorage.c
CommitLineData
92ca0c67
JY
1/** @file\r
2 Implement TPM1.2 NV storage related command.\r
3\r
b3548d32 4Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved. <BR>\r
8b1331df 5(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
289b714b 6SPDX-License-Identifier: BSD-2-Clause-Patent\r
92ca0c67
JY
7\r
8**/\r
9\r
83b9662f 10#include <PiPei.h>\r
92ca0c67 11#include <Library/Tpm12CommandLib.h>\r
83b9662f 12#include <Library/BaseLib.h>\r
92ca0c67 13#include <Library/DebugLib.h>\r
83b9662f
MK
14#include <Library/BaseMemoryLib.h>\r
15#include <Library/Tpm12DeviceLib.h>\r
92ca0c67
JY
16\r
17//\r
83b9662f 18// Max TPM NV value length\r
92ca0c67 19//\r
83b9662f 20#define TPMNVVALUELENGTH 1024\r
92ca0c67
JY
21\r
22#pragma pack(1)\r
23\r
24typedef struct {\r
c411b485
MK
25 TPM_RQU_COMMAND_HDR Hdr;\r
26 TPM12_NV_DATA_PUBLIC PubInfo;\r
27 TPM_ENCAUTH EncAuth;\r
92ca0c67
JY
28} TPM_CMD_NV_DEFINE_SPACE;\r
29\r
92ca0c67 30typedef struct {\r
c411b485
MK
31 TPM_RQU_COMMAND_HDR Hdr;\r
32 TPM_NV_INDEX NvIndex;\r
33 UINT32 Offset;\r
34 UINT32 DataSize;\r
92ca0c67
JY
35} TPM_CMD_NV_READ_VALUE;\r
36\r
37typedef struct {\r
c411b485
MK
38 TPM_RSP_COMMAND_HDR Hdr;\r
39 UINT32 DataSize;\r
40 UINT8 Data[TPMNVVALUELENGTH];\r
92ca0c67
JY
41} TPM_RSP_NV_READ_VALUE;\r
42\r
43typedef struct {\r
c411b485
MK
44 TPM_RQU_COMMAND_HDR Hdr;\r
45 TPM_NV_INDEX NvIndex;\r
46 UINT32 Offset;\r
47 UINT32 DataSize;\r
48 UINT8 Data[TPMNVVALUELENGTH];\r
92ca0c67
JY
49} TPM_CMD_NV_WRITE_VALUE;\r
50\r
92ca0c67
JY
51#pragma pack()\r
52\r
53/**\r
54 Send NV DefineSpace command to TPM1.2.\r
b3548d32 55\r
92ca0c67
JY
56 @param PubInfo The public parameters of the NV area.\r
57 @param EncAuth The encrypted AuthData, only valid if the attributes require subsequent authorization.\r
58\r
59 @retval EFI_SUCCESS Operation completed successfully.\r
60 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
61**/\r
62EFI_STATUS\r
63EFIAPI\r
64Tpm12NvDefineSpace (\r
65 IN TPM12_NV_DATA_PUBLIC *PubInfo,\r
66 IN TPM_ENCAUTH *EncAuth\r
67 )\r
68{\r
83b9662f
MK
69 EFI_STATUS Status;\r
70 TPM_CMD_NV_DEFINE_SPACE Command;\r
71 TPM_RSP_COMMAND_HDR Response;\r
72 UINT32 Length;\r
92ca0c67
JY
73\r
74 //\r
75 // send Tpm command TPM_ORD_NV_DefineSpace\r
76 //\r
c411b485
MK
77 Command.Hdr.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND);\r
78 Command.Hdr.paramSize = SwapBytes32 (sizeof (Command));\r
79 Command.Hdr.ordinal = SwapBytes32 (TPM_ORD_NV_DefineSpace);\r
80 Command.PubInfo.tag = SwapBytes16 (PubInfo->tag);\r
81 Command.PubInfo.nvIndex = SwapBytes32 (PubInfo->nvIndex);\r
82 Command.PubInfo.pcrInfoRead.pcrSelection.sizeOfSelect = SwapBytes16 (PubInfo->pcrInfoRead.pcrSelection.sizeOfSelect);\r
83 Command.PubInfo.pcrInfoRead.pcrSelection.pcrSelect[0] = PubInfo->pcrInfoRead.pcrSelection.pcrSelect[0];\r
84 Command.PubInfo.pcrInfoRead.pcrSelection.pcrSelect[1] = PubInfo->pcrInfoRead.pcrSelection.pcrSelect[1];\r
85 Command.PubInfo.pcrInfoRead.pcrSelection.pcrSelect[2] = PubInfo->pcrInfoRead.pcrSelection.pcrSelect[2];\r
86 Command.PubInfo.pcrInfoRead.localityAtRelease = PubInfo->pcrInfoRead.localityAtRelease;\r
87 CopyMem (&Command.PubInfo.pcrInfoRead.digestAtRelease, &PubInfo->pcrInfoRead.digestAtRelease, sizeof (PubInfo->pcrInfoRead.digestAtRelease));\r
83b9662f
MK
88 Command.PubInfo.pcrInfoWrite.pcrSelection.sizeOfSelect = SwapBytes16 (PubInfo->pcrInfoWrite.pcrSelection.sizeOfSelect);\r
89 Command.PubInfo.pcrInfoWrite.pcrSelection.pcrSelect[0] = PubInfo->pcrInfoWrite.pcrSelection.pcrSelect[0];\r
90 Command.PubInfo.pcrInfoWrite.pcrSelection.pcrSelect[1] = PubInfo->pcrInfoWrite.pcrSelection.pcrSelect[1];\r
91 Command.PubInfo.pcrInfoWrite.pcrSelection.pcrSelect[2] = PubInfo->pcrInfoWrite.pcrSelection.pcrSelect[2];\r
92 Command.PubInfo.pcrInfoWrite.localityAtRelease = PubInfo->pcrInfoWrite.localityAtRelease;\r
c411b485 93 CopyMem (&Command.PubInfo.pcrInfoWrite.digestAtRelease, &PubInfo->pcrInfoWrite.digestAtRelease, sizeof (PubInfo->pcrInfoWrite.digestAtRelease));\r
83b9662f
MK
94 Command.PubInfo.permission.tag = SwapBytes16 (PubInfo->permission.tag);\r
95 Command.PubInfo.permission.attributes = SwapBytes32 (PubInfo->permission.attributes);\r
96 Command.PubInfo.bReadSTClear = PubInfo->bReadSTClear;\r
97 Command.PubInfo.bWriteSTClear = PubInfo->bWriteSTClear;\r
98 Command.PubInfo.bWriteDefine = PubInfo->bWriteDefine;\r
99 Command.PubInfo.dataSize = SwapBytes32 (PubInfo->dataSize);\r
c411b485 100 CopyMem (&Command.EncAuth, EncAuth, sizeof (*EncAuth));\r
83b9662f
MK
101 Length = sizeof (Response);\r
102 Status = Tpm12SubmitCommand (sizeof (Command), (UINT8 *)&Command, &Length, (UINT8 *)&Response);\r
92ca0c67
JY
103 if (EFI_ERROR (Status)) {\r
104 return Status;\r
105 }\r
c411b485 106\r
83b9662f
MK
107 DEBUG ((DEBUG_INFO, "Tpm12NvDefineSpace - ReturnCode = %x\n", SwapBytes32 (Response.returnCode)));\r
108 switch (SwapBytes32 (Response.returnCode)) {\r
c411b485
MK
109 case TPM_SUCCESS:\r
110 return EFI_SUCCESS;\r
111 default:\r
112 return EFI_DEVICE_ERROR;\r
92ca0c67 113 }\r
92ca0c67
JY
114}\r
115\r
116/**\r
117 Send NV ReadValue command to TPM1.2.\r
118\r
119 @param NvIndex The index of the area to set.\r
120 @param Offset The offset into the area.\r
121 @param DataSize The size of the data area.\r
122 @param Data The data to set the area to.\r
123\r
124 @retval EFI_SUCCESS Operation completed successfully.\r
125 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
126**/\r
127EFI_STATUS\r
128EFIAPI\r
129Tpm12NvReadValue (\r
83b9662f
MK
130 IN TPM_NV_INDEX NvIndex,\r
131 IN UINT32 Offset,\r
132 IN OUT UINT32 *DataSize,\r
133 OUT UINT8 *Data\r
92ca0c67
JY
134 )\r
135{\r
83b9662f
MK
136 EFI_STATUS Status;\r
137 TPM_CMD_NV_READ_VALUE Command;\r
138 TPM_RSP_NV_READ_VALUE Response;\r
139 UINT32 Length;\r
92ca0c67
JY
140\r
141 //\r
142 // send Tpm command TPM_ORD_NV_ReadValue\r
143 //\r
83b9662f
MK
144 Command.Hdr.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND);\r
145 Command.Hdr.paramSize = SwapBytes32 (sizeof (Command));\r
146 Command.Hdr.ordinal = SwapBytes32 (TPM_ORD_NV_ReadValue);\r
147 Command.NvIndex = SwapBytes32 (NvIndex);\r
148 Command.Offset = SwapBytes32 (Offset);\r
149 Command.DataSize = SwapBytes32 (*DataSize);\r
c411b485
MK
150 Length = sizeof (Response);\r
151 Status = Tpm12SubmitCommand (sizeof (Command), (UINT8 *)&Command, &Length, (UINT8 *)&Response);\r
92ca0c67
JY
152 if (EFI_ERROR (Status)) {\r
153 return Status;\r
154 }\r
c411b485 155\r
83b9662f
MK
156 DEBUG ((DEBUG_INFO, "Tpm12NvReadValue - ReturnCode = %x\n", SwapBytes32 (Response.Hdr.returnCode)));\r
157 switch (SwapBytes32 (Response.Hdr.returnCode)) {\r
c411b485
MK
158 case TPM_SUCCESS:\r
159 break;\r
160 default:\r
161 return EFI_DEVICE_ERROR;\r
92ca0c67
JY
162 }\r
163\r
164 //\r
165 // Return the response\r
166 //\r
83b9662f
MK
167 if (SwapBytes32 (Response.DataSize) > *DataSize) {\r
168 return EFI_BUFFER_TOO_SMALL;\r
169 }\r
c411b485 170\r
83b9662f
MK
171 *DataSize = SwapBytes32 (Response.DataSize);\r
172 ZeroMem (Data, *DataSize);\r
173 CopyMem (Data, &Response.Data, *DataSize);\r
92ca0c67
JY
174\r
175 return EFI_SUCCESS;\r
176}\r
177\r
178/**\r
179 Send NV WriteValue command to TPM1.2.\r
b3548d32 180\r
92ca0c67
JY
181 @param NvIndex The index of the area to set.\r
182 @param Offset The offset into the NV Area.\r
183 @param DataSize The size of the data parameter.\r
184 @param Data The data to set the area to.\r
185\r
186 @retval EFI_SUCCESS Operation completed successfully.\r
187 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
188**/\r
189EFI_STATUS\r
190EFIAPI\r
191Tpm12NvWriteValue (\r
83b9662f
MK
192 IN TPM_NV_INDEX NvIndex,\r
193 IN UINT32 Offset,\r
194 IN UINT32 DataSize,\r
195 IN UINT8 *Data\r
92ca0c67
JY
196 )\r
197{\r
83b9662f
MK
198 EFI_STATUS Status;\r
199 TPM_CMD_NV_WRITE_VALUE Command;\r
8b1331df 200 UINT32 CommandLength;\r
83b9662f 201 TPM_RSP_COMMAND_HDR Response;\r
8b1331df 202 UINT32 ResponseLength;\r
83b9662f
MK
203\r
204 if (DataSize > sizeof (Command.Data)) {\r
92ca0c67
JY
205 return EFI_UNSUPPORTED;\r
206 }\r
207\r
208 //\r
209 // send Tpm command TPM_ORD_NV_WriteValue\r
210 //\r
83b9662f 211 Command.Hdr.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND);\r
c411b485 212 CommandLength = sizeof (Command) - sizeof (Command.Data) + DataSize;\r
8b1331df 213 Command.Hdr.paramSize = SwapBytes32 (CommandLength);\r
83b9662f
MK
214 Command.Hdr.ordinal = SwapBytes32 (TPM_ORD_NV_WriteValue);\r
215 Command.NvIndex = SwapBytes32 (NvIndex);\r
216 Command.Offset = SwapBytes32 (Offset);\r
217 Command.DataSize = SwapBytes32 (DataSize);\r
218 CopyMem (Command.Data, Data, DataSize);\r
8b1331df 219 ResponseLength = sizeof (Response);\r
c411b485 220 Status = Tpm12SubmitCommand (CommandLength, (UINT8 *)&Command, &ResponseLength, (UINT8 *)&Response);\r
92ca0c67
JY
221 if (EFI_ERROR (Status)) {\r
222 return Status;\r
223 }\r
c411b485 224\r
d6b926e7 225 DEBUG ((DEBUG_INFO, "Tpm12NvWriteValue - ReturnCode = %x\n", SwapBytes32 (Response.returnCode)));\r
83b9662f 226 switch (SwapBytes32 (Response.returnCode)) {\r
c411b485
MK
227 case TPM_SUCCESS:\r
228 return EFI_SUCCESS;\r
229 default:\r
230 return EFI_DEVICE_ERROR;\r
92ca0c67 231 }\r
92ca0c67 232}\r