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