2 Implement TPM1.2 NV storage related command.
4 Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved. <BR>
5 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include <Library/Tpm12CommandLib.h>
12 #include <Library/BaseLib.h>
13 #include <Library/DebugLib.h>
14 #include <Library/BaseMemoryLib.h>
15 #include <Library/Tpm12DeviceLib.h>
18 // Max TPM NV value length
20 #define TPMNVVALUELENGTH 1024
25 TPM_RQU_COMMAND_HDR Hdr
;
26 TPM12_NV_DATA_PUBLIC PubInfo
;
28 } TPM_CMD_NV_DEFINE_SPACE
;
31 TPM_RQU_COMMAND_HDR Hdr
;
35 } TPM_CMD_NV_READ_VALUE
;
38 TPM_RSP_COMMAND_HDR Hdr
;
40 UINT8 Data
[TPMNVVALUELENGTH
];
41 } TPM_RSP_NV_READ_VALUE
;
44 TPM_RQU_COMMAND_HDR Hdr
;
48 UINT8 Data
[TPMNVVALUELENGTH
];
49 } TPM_CMD_NV_WRITE_VALUE
;
54 Send NV DefineSpace command to TPM1.2.
56 @param PubInfo The public parameters of the NV area.
57 @param EncAuth The encrypted AuthData, only valid if the attributes require subsequent authorization.
59 @retval EFI_SUCCESS Operation completed successfully.
60 @retval EFI_DEVICE_ERROR Unexpected device behavior.
65 IN TPM12_NV_DATA_PUBLIC
*PubInfo
,
66 IN TPM_ENCAUTH
*EncAuth
70 TPM_CMD_NV_DEFINE_SPACE Command
;
71 TPM_RSP_COMMAND_HDR Response
;
75 // send Tpm command TPM_ORD_NV_DefineSpace
77 Command
.Hdr
.tag
= SwapBytes16 (TPM_TAG_RQU_COMMAND
);
78 Command
.Hdr
.paramSize
= SwapBytes32 (sizeof (Command
));
79 Command
.Hdr
.ordinal
= SwapBytes32 (TPM_ORD_NV_DefineSpace
);
80 Command
.PubInfo
.tag
= SwapBytes16 (PubInfo
->tag
);
81 Command
.PubInfo
.nvIndex
= SwapBytes32 (PubInfo
->nvIndex
);
82 Command
.PubInfo
.pcrInfoRead
.pcrSelection
.sizeOfSelect
= SwapBytes16 (PubInfo
->pcrInfoRead
.pcrSelection
.sizeOfSelect
);
83 Command
.PubInfo
.pcrInfoRead
.pcrSelection
.pcrSelect
[0] = PubInfo
->pcrInfoRead
.pcrSelection
.pcrSelect
[0];
84 Command
.PubInfo
.pcrInfoRead
.pcrSelection
.pcrSelect
[1] = PubInfo
->pcrInfoRead
.pcrSelection
.pcrSelect
[1];
85 Command
.PubInfo
.pcrInfoRead
.pcrSelection
.pcrSelect
[2] = PubInfo
->pcrInfoRead
.pcrSelection
.pcrSelect
[2];
86 Command
.PubInfo
.pcrInfoRead
.localityAtRelease
= PubInfo
->pcrInfoRead
.localityAtRelease
;
87 CopyMem (&Command
.PubInfo
.pcrInfoRead
.digestAtRelease
, &PubInfo
->pcrInfoRead
.digestAtRelease
, sizeof (PubInfo
->pcrInfoRead
.digestAtRelease
));
88 Command
.PubInfo
.pcrInfoWrite
.pcrSelection
.sizeOfSelect
= SwapBytes16 (PubInfo
->pcrInfoWrite
.pcrSelection
.sizeOfSelect
);
89 Command
.PubInfo
.pcrInfoWrite
.pcrSelection
.pcrSelect
[0] = PubInfo
->pcrInfoWrite
.pcrSelection
.pcrSelect
[0];
90 Command
.PubInfo
.pcrInfoWrite
.pcrSelection
.pcrSelect
[1] = PubInfo
->pcrInfoWrite
.pcrSelection
.pcrSelect
[1];
91 Command
.PubInfo
.pcrInfoWrite
.pcrSelection
.pcrSelect
[2] = PubInfo
->pcrInfoWrite
.pcrSelection
.pcrSelect
[2];
92 Command
.PubInfo
.pcrInfoWrite
.localityAtRelease
= PubInfo
->pcrInfoWrite
.localityAtRelease
;
93 CopyMem (&Command
.PubInfo
.pcrInfoWrite
.digestAtRelease
, &PubInfo
->pcrInfoWrite
.digestAtRelease
, sizeof (PubInfo
->pcrInfoWrite
.digestAtRelease
));
94 Command
.PubInfo
.permission
.tag
= SwapBytes16 (PubInfo
->permission
.tag
);
95 Command
.PubInfo
.permission
.attributes
= SwapBytes32 (PubInfo
->permission
.attributes
);
96 Command
.PubInfo
.bReadSTClear
= PubInfo
->bReadSTClear
;
97 Command
.PubInfo
.bWriteSTClear
= PubInfo
->bWriteSTClear
;
98 Command
.PubInfo
.bWriteDefine
= PubInfo
->bWriteDefine
;
99 Command
.PubInfo
.dataSize
= SwapBytes32 (PubInfo
->dataSize
);
100 CopyMem (&Command
.EncAuth
, EncAuth
, sizeof (*EncAuth
));
101 Length
= sizeof (Response
);
102 Status
= Tpm12SubmitCommand (sizeof (Command
), (UINT8
*)&Command
, &Length
, (UINT8
*)&Response
);
103 if (EFI_ERROR (Status
)) {
107 DEBUG ((DEBUG_INFO
, "Tpm12NvDefineSpace - ReturnCode = %x\n", SwapBytes32 (Response
.returnCode
)));
108 switch (SwapBytes32 (Response
.returnCode
)) {
112 return EFI_DEVICE_ERROR
;
117 Send NV ReadValue command to TPM1.2.
119 @param NvIndex The index of the area to set.
120 @param Offset The offset into the area.
121 @param DataSize The size of the data area.
122 @param Data The data to set the area to.
124 @retval EFI_SUCCESS Operation completed successfully.
125 @retval EFI_DEVICE_ERROR Unexpected device behavior.
130 IN TPM_NV_INDEX NvIndex
,
132 IN OUT UINT32
*DataSize
,
137 TPM_CMD_NV_READ_VALUE Command
;
138 TPM_RSP_NV_READ_VALUE Response
;
142 // send Tpm command TPM_ORD_NV_ReadValue
144 Command
.Hdr
.tag
= SwapBytes16 (TPM_TAG_RQU_COMMAND
);
145 Command
.Hdr
.paramSize
= SwapBytes32 (sizeof (Command
));
146 Command
.Hdr
.ordinal
= SwapBytes32 (TPM_ORD_NV_ReadValue
);
147 Command
.NvIndex
= SwapBytes32 (NvIndex
);
148 Command
.Offset
= SwapBytes32 (Offset
);
149 Command
.DataSize
= SwapBytes32 (*DataSize
);
150 Length
= sizeof (Response
);
151 Status
= Tpm12SubmitCommand (sizeof (Command
), (UINT8
*)&Command
, &Length
, (UINT8
*)&Response
);
152 if (EFI_ERROR (Status
)) {
156 DEBUG ((DEBUG_INFO
, "Tpm12NvReadValue - ReturnCode = %x\n", SwapBytes32 (Response
.Hdr
.returnCode
)));
157 switch (SwapBytes32 (Response
.Hdr
.returnCode
)) {
161 return EFI_DEVICE_ERROR
;
165 // Return the response
167 if (SwapBytes32 (Response
.DataSize
) > *DataSize
) {
168 return EFI_BUFFER_TOO_SMALL
;
171 *DataSize
= SwapBytes32 (Response
.DataSize
);
172 ZeroMem (Data
, *DataSize
);
173 CopyMem (Data
, &Response
.Data
, *DataSize
);
179 Send NV WriteValue command to TPM1.2.
181 @param NvIndex The index of the area to set.
182 @param Offset The offset into the NV Area.
183 @param DataSize The size of the data parameter.
184 @param Data The data to set the area to.
186 @retval EFI_SUCCESS Operation completed successfully.
187 @retval EFI_DEVICE_ERROR Unexpected device behavior.
192 IN TPM_NV_INDEX NvIndex
,
199 TPM_CMD_NV_WRITE_VALUE Command
;
200 UINT32 CommandLength
;
201 TPM_RSP_COMMAND_HDR Response
;
202 UINT32 ResponseLength
;
204 if (DataSize
> sizeof (Command
.Data
)) {
205 return EFI_UNSUPPORTED
;
209 // send Tpm command TPM_ORD_NV_WriteValue
211 Command
.Hdr
.tag
= SwapBytes16 (TPM_TAG_RQU_COMMAND
);
212 CommandLength
= sizeof (Command
) - sizeof (Command
.Data
) + DataSize
;
213 Command
.Hdr
.paramSize
= SwapBytes32 (CommandLength
);
214 Command
.Hdr
.ordinal
= SwapBytes32 (TPM_ORD_NV_WriteValue
);
215 Command
.NvIndex
= SwapBytes32 (NvIndex
);
216 Command
.Offset
= SwapBytes32 (Offset
);
217 Command
.DataSize
= SwapBytes32 (DataSize
);
218 CopyMem (Command
.Data
, Data
, DataSize
);
219 ResponseLength
= sizeof (Response
);
220 Status
= Tpm12SubmitCommand (CommandLength
, (UINT8
*)&Command
, &ResponseLength
, (UINT8
*)&Response
);
221 if (EFI_ERROR (Status
)) {
225 DEBUG ((DEBUG_INFO
, "Tpm12NvWriteValue - ReturnCode = %x\n", SwapBytes32 (Response
.returnCode
)));
226 switch (SwapBytes32 (Response
.returnCode
)) {
230 return EFI_DEVICE_ERROR
;