]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/Tpm2CommandLib/Tpm2Sequences.c
SecurityPkg: Apply uncrustify changes
[mirror_edk2.git] / SecurityPkg / Library / Tpm2CommandLib / Tpm2Sequences.c
CommitLineData
c1d93242
JY
1/** @file\r
2 Implement TPM2 Sequences related command.\r
3\r
dd577319 4Copyright (c) 2013 - 2018, 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
c411b485
MK
19 TPM2_COMMAND_HEADER Header;\r
20 TPM2B_AUTH Auth;\r
21 TPMI_ALG_HASH HashAlg;\r
c1d93242
JY
22} TPM2_HASH_SEQUENCE_START_COMMAND;\r
23\r
24typedef struct {\r
c411b485
MK
25 TPM2_RESPONSE_HEADER Header;\r
26 TPMI_DH_OBJECT SequenceHandle;\r
c1d93242
JY
27} TPM2_HASH_SEQUENCE_START_RESPONSE;\r
28\r
29typedef struct {\r
c411b485
MK
30 TPM2_COMMAND_HEADER Header;\r
31 TPMI_DH_OBJECT SequenceHandle;\r
32 UINT32 AuthorizationSize;\r
33 TPMS_AUTH_COMMAND AuthSessionSeq;\r
34 TPM2B_MAX_BUFFER Buffer;\r
c1d93242
JY
35} TPM2_SEQUENCE_UPDATE_COMMAND;\r
36\r
37typedef struct {\r
c411b485
MK
38 TPM2_RESPONSE_HEADER Header;\r
39 UINT32 ParameterSize;\r
40 TPMS_AUTH_RESPONSE AuthSessionSeq;\r
c1d93242
JY
41} TPM2_SEQUENCE_UPDATE_RESPONSE;\r
42\r
43typedef struct {\r
c411b485
MK
44 TPM2_COMMAND_HEADER Header;\r
45 TPMI_DH_PCR PcrHandle;\r
46 TPMI_DH_OBJECT SequenceHandle;\r
47 UINT32 AuthorizationSize;\r
48 TPMS_AUTH_COMMAND AuthSessionPcr;\r
49 TPMS_AUTH_COMMAND AuthSessionSeq;\r
50 TPM2B_MAX_BUFFER Buffer;\r
c1d93242
JY
51} TPM2_EVENT_SEQUENCE_COMPLETE_COMMAND;\r
52\r
53typedef struct {\r
c411b485
MK
54 TPM2_RESPONSE_HEADER Header;\r
55 UINT32 ParameterSize;\r
56 TPML_DIGEST_VALUES Results;\r
57 TPMS_AUTH_RESPONSE AuthSessionPcr;\r
58 TPMS_AUTH_RESPONSE AuthSessionSeq;\r
c1d93242
JY
59} TPM2_EVENT_SEQUENCE_COMPLETE_RESPONSE;\r
60\r
61typedef struct {\r
c411b485
MK
62 TPM2_COMMAND_HEADER Header;\r
63 TPMI_DH_OBJECT SequenceHandle;\r
64 UINT32 AuthorizationSize;\r
65 TPMS_AUTH_COMMAND AuthSessionSeq;\r
66 TPM2B_MAX_BUFFER Buffer;\r
67 TPMI_RH_HIERARCHY Hierarchy;\r
c1d93242
JY
68} TPM2_SEQUENCE_COMPLETE_COMMAND;\r
69\r
70typedef struct {\r
c411b485
MK
71 TPM2_RESPONSE_HEADER Header;\r
72 UINT32 ParameterSize;\r
73 TPM2B_DIGEST Digest;\r
74 TPMS_AUTH_RESPONSE AuthSessionSeq;\r
c1d93242
JY
75} TPM2_SEQUENCE_COMPLETE_RESPONSE;\r
76\r
77#pragma pack()\r
78\r
79/**\r
80 This command starts a hash or an Event sequence.\r
81 If hashAlg is an implemented hash, then a hash sequence is started.\r
82 If hashAlg is TPM_ALG_NULL, then an Event sequence is started.\r
83\r
84 @param[in] HashAlg The hash algorithm to use for the hash sequence\r
85 An Event sequence starts if this is TPM_ALG_NULL.\r
86 @param[out] SequenceHandle A handle to reference the sequence\r
b3548d32 87\r
c1d93242
JY
88 @retval EFI_SUCCESS Operation completed successfully.\r
89 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
90**/\r
91EFI_STATUS\r
92EFIAPI\r
93Tpm2HashSequenceStart (\r
c411b485
MK
94 IN TPMI_ALG_HASH HashAlg,\r
95 OUT TPMI_DH_OBJECT *SequenceHandle\r
c1d93242
JY
96 )\r
97{\r
c411b485
MK
98 EFI_STATUS Status;\r
99 TPM2_HASH_SEQUENCE_START_COMMAND Cmd;\r
100 TPM2_HASH_SEQUENCE_START_RESPONSE Res;\r
101 UINT32 CmdSize;\r
102 UINT32 RespSize;\r
103 UINT8 *Buffer;\r
104 UINT32 ResultBufSize;\r
c1d93242 105\r
c411b485 106 ZeroMem (&Cmd, sizeof (Cmd));\r
c1d93242
JY
107\r
108 //\r
109 // Construct command\r
110 //\r
c411b485
MK
111 Cmd.Header.tag = SwapBytes16 (TPM_ST_NO_SESSIONS);\r
112 Cmd.Header.commandCode = SwapBytes32 (TPM_CC_HashSequenceStart);\r
c1d93242
JY
113\r
114 Buffer = (UINT8 *)&Cmd.Auth;\r
115\r
116 // auth = nullAuth\r
c411b485
MK
117 WriteUnaligned16 ((UINT16 *)Buffer, SwapBytes16 (0));\r
118 Buffer += sizeof (UINT16);\r
c1d93242
JY
119\r
120 // hashAlg\r
c411b485
MK
121 WriteUnaligned16 ((UINT16 *)Buffer, SwapBytes16 (HashAlg));\r
122 Buffer += sizeof (UINT16);\r
c1d93242 123\r
c411b485
MK
124 CmdSize = (UINT32)(Buffer - (UINT8 *)&Cmd);\r
125 Cmd.Header.paramSize = SwapBytes32 (CmdSize);\r
c1d93242
JY
126\r
127 //\r
128 // Call the TPM\r
129 //\r
c411b485
MK
130 ResultBufSize = sizeof (Res);\r
131 Status = Tpm2SubmitCommand (CmdSize, (UINT8 *)&Cmd, &ResultBufSize, (UINT8 *)&Res);\r
132 if (EFI_ERROR (Status)) {\r
c1d93242
JY
133 return Status;\r
134 }\r
135\r
c411b485 136 if (ResultBufSize > sizeof (Res)) {\r
e905fbb0 137 DEBUG ((DEBUG_ERROR, "HashSequenceStart: Failed ExecuteCommand: Buffer Too Small\r\n"));\r
c1d93242
JY
138 return EFI_BUFFER_TOO_SMALL;\r
139 }\r
140\r
141 //\r
142 // Validate response headers\r
143 //\r
c411b485
MK
144 RespSize = SwapBytes32 (Res.Header.paramSize);\r
145 if (RespSize > sizeof (Res)) {\r
e905fbb0 146 DEBUG ((DEBUG_ERROR, "HashSequenceStart: Response size too large! %d\r\n", RespSize));\r
c1d93242
JY
147 return EFI_BUFFER_TOO_SMALL;\r
148 }\r
149\r
150 //\r
151 // Fail if command failed\r
152 //\r
c411b485
MK
153 if (SwapBytes32 (Res.Header.responseCode) != TPM_RC_SUCCESS) {\r
154 DEBUG ((DEBUG_ERROR, "HashSequenceStart: Response Code error! 0x%08x\r\n", SwapBytes32 (Res.Header.responseCode)));\r
c1d93242
JY
155 return EFI_DEVICE_ERROR;\r
156 }\r
157\r
158 //\r
159 // Unmarshal the response\r
160 //\r
161\r
162 // sequenceHandle\r
c411b485 163 *SequenceHandle = SwapBytes32 (Res.SequenceHandle);\r
c1d93242
JY
164\r
165 return EFI_SUCCESS;\r
166}\r
167\r
168/**\r
169 This command is used to add data to a hash or HMAC sequence.\r
170 The amount of data in buffer may be any size up to the limits of the TPM.\r
171 NOTE: In all TPM, a buffer size of 1,024 octets is allowed.\r
172\r
173 @param[in] SequenceHandle Handle for the sequence object\r
174 @param[in] Buffer Data to be added to hash\r
b3548d32 175\r
c1d93242
JY
176 @retval EFI_SUCCESS Operation completed successfully.\r
177 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
178**/\r
179EFI_STATUS\r
180EFIAPI\r
181Tpm2SequenceUpdate (\r
c411b485
MK
182 IN TPMI_DH_OBJECT SequenceHandle,\r
183 IN TPM2B_MAX_BUFFER *Buffer\r
c1d93242
JY
184 )\r
185{\r
c411b485
MK
186 EFI_STATUS Status;\r
187 TPM2_SEQUENCE_UPDATE_COMMAND Cmd;\r
188 TPM2_SEQUENCE_UPDATE_RESPONSE Res;\r
189 UINT32 CmdSize;\r
190 UINT32 RespSize;\r
191 UINT8 *BufferPtr;\r
192 UINT32 SessionInfoSize;\r
193 UINT32 ResultBufSize;\r
c1d93242 194\r
c411b485 195 ZeroMem (&Cmd, sizeof (Cmd));\r
c1d93242
JY
196\r
197 //\r
198 // Construct command\r
199 //\r
c411b485
MK
200 Cmd.Header.tag = SwapBytes16 (TPM_ST_SESSIONS);\r
201 Cmd.Header.commandCode = SwapBytes32 (TPM_CC_SequenceUpdate);\r
202 Cmd.SequenceHandle = SwapBytes32 (SequenceHandle);\r
c1d93242
JY
203\r
204 //\r
205 // Add in Auth session\r
206 //\r
207 BufferPtr = (UINT8 *)&Cmd.AuthSessionSeq;\r
208\r
209 // sessionInfoSize\r
c411b485
MK
210 SessionInfoSize = CopyAuthSessionCommand (NULL, BufferPtr);\r
211 BufferPtr += SessionInfoSize;\r
212 Cmd.AuthorizationSize = SwapBytes32 (SessionInfoSize);\r
c1d93242
JY
213\r
214 // buffer.size\r
c411b485
MK
215 WriteUnaligned16 ((UINT16 *)BufferPtr, SwapBytes16 (Buffer->size));\r
216 BufferPtr += sizeof (UINT16);\r
c1d93242 217\r
c411b485 218 CopyMem (BufferPtr, &Buffer->buffer, Buffer->size);\r
c1d93242
JY
219 BufferPtr += Buffer->size;\r
220\r
c411b485
MK
221 CmdSize = (UINT32)(BufferPtr - (UINT8 *)&Cmd);\r
222 Cmd.Header.paramSize = SwapBytes32 (CmdSize);\r
c1d93242
JY
223\r
224 //\r
225 // Call the TPM\r
226 //\r
c411b485
MK
227 ResultBufSize = sizeof (Res);\r
228 Status = Tpm2SubmitCommand (CmdSize, (UINT8 *)&Cmd, &ResultBufSize, (UINT8 *)&Res);\r
229 if (EFI_ERROR (Status)) {\r
c1d93242
JY
230 return Status;\r
231 }\r
232\r
c411b485 233 if (ResultBufSize > sizeof (Res)) {\r
e905fbb0 234 DEBUG ((DEBUG_ERROR, "SequenceUpdate: Failed ExecuteCommand: Buffer Too Small\r\n"));\r
c1d93242
JY
235 return EFI_BUFFER_TOO_SMALL;\r
236 }\r
237\r
238 //\r
239 // Validate response headers\r
240 //\r
c411b485
MK
241 RespSize = SwapBytes32 (Res.Header.paramSize);\r
242 if (RespSize > sizeof (Res)) {\r
e905fbb0 243 DEBUG ((DEBUG_ERROR, "SequenceUpdate: Response size too large! %d\r\n", RespSize));\r
c1d93242
JY
244 return EFI_BUFFER_TOO_SMALL;\r
245 }\r
246\r
247 //\r
248 // Fail if command failed\r
249 //\r
c411b485
MK
250 if (SwapBytes32 (Res.Header.responseCode) != TPM_RC_SUCCESS) {\r
251 DEBUG ((DEBUG_ERROR, "SequenceUpdate: Response Code error! 0x%08x\r\n", SwapBytes32 (Res.Header.responseCode)));\r
c1d93242
JY
252 return EFI_DEVICE_ERROR;\r
253 }\r
254\r
255 //\r
256 // Unmarshal the response\r
257 //\r
258\r
259 // None\r
260\r
261 return EFI_SUCCESS;\r
262}\r
263\r
264/**\r
265 This command adds the last part of data, if any, to an Event sequence and returns the result in a digest list.\r
266 If pcrHandle references a PCR and not TPM_RH_NULL, then the returned digest list is processed in\r
267 the same manner as the digest list input parameter to TPM2_PCR_Extend() with the pcrHandle in each\r
268 bank extended with the associated digest value.\r
269\r
270 @param[in] PcrHandle PCR to be extended with the Event data\r
271 @param[in] SequenceHandle Authorization for the sequence\r
272 @param[in] Buffer Data to be added to the Event\r
273 @param[out] Results List of digests computed for the PCR\r
b3548d32 274\r
c1d93242
JY
275 @retval EFI_SUCCESS Operation completed successfully.\r
276 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
277**/\r
278EFI_STATUS\r
279EFIAPI\r
280Tpm2EventSequenceComplete (\r
c411b485
MK
281 IN TPMI_DH_PCR PcrHandle,\r
282 IN TPMI_DH_OBJECT SequenceHandle,\r
283 IN TPM2B_MAX_BUFFER *Buffer,\r
284 OUT TPML_DIGEST_VALUES *Results\r
c1d93242
JY
285 )\r
286{\r
c411b485
MK
287 EFI_STATUS Status;\r
288 TPM2_EVENT_SEQUENCE_COMPLETE_COMMAND Cmd;\r
289 TPM2_EVENT_SEQUENCE_COMPLETE_RESPONSE Res;\r
290 UINT32 CmdSize;\r
291 UINT32 RespSize;\r
292 UINT8 *BufferPtr;\r
293 UINT32 SessionInfoSize;\r
294 UINT32 SessionInfoSize2;\r
295 UINT32 Index;\r
296 UINT32 ResultBufSize;\r
297 UINT16 DigestSize;\r
c1d93242 298\r
c411b485 299 ZeroMem (&Cmd, sizeof (Cmd));\r
c1d93242
JY
300\r
301 //\r
302 // Construct command\r
303 //\r
c411b485
MK
304 Cmd.Header.tag = SwapBytes16 (TPM_ST_SESSIONS);\r
305 Cmd.Header.commandCode = SwapBytes32 (TPM_CC_EventSequenceComplete);\r
306 Cmd.PcrHandle = SwapBytes32 (PcrHandle);\r
307 Cmd.SequenceHandle = SwapBytes32 (SequenceHandle);\r
c1d93242
JY
308\r
309 //\r
310 // Add in pcrHandle Auth session\r
311 //\r
312 BufferPtr = (UINT8 *)&Cmd.AuthSessionPcr;\r
313\r
314 // sessionInfoSize\r
315 SessionInfoSize = CopyAuthSessionCommand (NULL, BufferPtr);\r
c411b485 316 BufferPtr += SessionInfoSize;\r
c1d93242
JY
317\r
318 // sessionInfoSize\r
c411b485
MK
319 SessionInfoSize2 = CopyAuthSessionCommand (NULL, BufferPtr);\r
320 BufferPtr += SessionInfoSize2;\r
321 Cmd.AuthorizationSize = SwapBytes32 (SessionInfoSize + SessionInfoSize2);\r
c1d93242
JY
322\r
323 // buffer.size\r
c411b485
MK
324 WriteUnaligned16 ((UINT16 *)BufferPtr, SwapBytes16 (Buffer->size));\r
325 BufferPtr += sizeof (UINT16);\r
c1d93242 326\r
c411b485 327 CopyMem (BufferPtr, &Buffer->buffer[0], Buffer->size);\r
c1d93242
JY
328 BufferPtr += Buffer->size;\r
329\r
c411b485
MK
330 CmdSize = (UINT32)(BufferPtr - (UINT8 *)&Cmd);\r
331 Cmd.Header.paramSize = SwapBytes32 (CmdSize);\r
c1d93242
JY
332\r
333 //\r
334 // Call the TPM\r
335 //\r
c411b485
MK
336 ResultBufSize = sizeof (Res);\r
337 Status = Tpm2SubmitCommand (CmdSize, (UINT8 *)&Cmd, &ResultBufSize, (UINT8 *)&Res);\r
338 if (EFI_ERROR (Status)) {\r
c1d93242
JY
339 return Status;\r
340 }\r
341\r
c411b485 342 if (ResultBufSize > sizeof (Res)) {\r
e905fbb0 343 DEBUG ((DEBUG_ERROR, "EventSequenceComplete: Failed ExecuteCommand: Buffer Too Small\r\n"));\r
c1d93242
JY
344 return EFI_BUFFER_TOO_SMALL;\r
345 }\r
346\r
347 //\r
348 // Validate response headers\r
349 //\r
c411b485
MK
350 RespSize = SwapBytes32 (Res.Header.paramSize);\r
351 if (RespSize > sizeof (Res)) {\r
e905fbb0 352 DEBUG ((DEBUG_ERROR, "EventSequenceComplete: Response size too large! %d\r\n", RespSize));\r
c1d93242
JY
353 return EFI_BUFFER_TOO_SMALL;\r
354 }\r
355\r
356 //\r
357 // Fail if command failed\r
358 //\r
c411b485
MK
359 if (SwapBytes32 (Res.Header.responseCode) != TPM_RC_SUCCESS) {\r
360 DEBUG ((DEBUG_ERROR, "EventSequenceComplete: Response Code error! 0x%08x\r\n", SwapBytes32 (Res.Header.responseCode)));\r
c1d93242
JY
361 return EFI_DEVICE_ERROR;\r
362 }\r
363\r
364 //\r
365 // Unmarshal the response\r
366 //\r
367\r
368 BufferPtr = (UINT8 *)&Res.Results;\r
369\r
370 // count\r
c411b485 371 Results->count = SwapBytes32 (ReadUnaligned32 ((UINT32 *)BufferPtr));\r
dd577319
ZC
372 if (Results->count > HASH_COUNT) {\r
373 DEBUG ((DEBUG_ERROR, "Tpm2EventSequenceComplete - Results->count error %x\n", Results->count));\r
374 return EFI_DEVICE_ERROR;\r
375 }\r
376\r
c411b485 377 BufferPtr += sizeof (UINT32);\r
c1d93242
JY
378\r
379 for (Index = 0; Index < Results->count; Index++) {\r
c411b485
MK
380 Results->digests[Index].hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)BufferPtr));\r
381 BufferPtr += sizeof (UINT16);\r
c1d93242
JY
382\r
383 DigestSize = GetHashSizeFromAlgo (Results->digests[Index].hashAlg);\r
384 if (DigestSize == 0) {\r
e905fbb0 385 DEBUG ((DEBUG_ERROR, "EventSequenceComplete: Unknown hash algorithm %d\r\n", Results->digests[Index].hashAlg));\r
c1d93242
JY
386 return EFI_DEVICE_ERROR;\r
387 }\r
c411b485
MK
388\r
389 CopyMem (\r
c1d93242
JY
390 &Results->digests[Index].digest,\r
391 BufferPtr,\r
392 DigestSize\r
393 );\r
394 BufferPtr += DigestSize;\r
395 }\r
396\r
397 return EFI_SUCCESS;\r
398}\r
399\r
400/**\r
401 This command adds the last part of data, if any, to a hash/HMAC sequence and returns the result.\r
402\r
403 @param[in] SequenceHandle Authorization for the sequence\r
404 @param[in] Buffer Data to be added to the hash/HMAC\r
405 @param[out] Result The returned HMAC or digest in a sized buffer\r
b3548d32 406\r
c1d93242
JY
407 @retval EFI_SUCCESS Operation completed successfully.\r
408 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
409**/\r
410EFI_STATUS\r
411EFIAPI\r
412Tpm2SequenceComplete (\r
c411b485
MK
413 IN TPMI_DH_OBJECT SequenceHandle,\r
414 IN TPM2B_MAX_BUFFER *Buffer,\r
415 OUT TPM2B_DIGEST *Result\r
c1d93242
JY
416 )\r
417{\r
c411b485
MK
418 EFI_STATUS Status;\r
419 TPM2_SEQUENCE_COMPLETE_COMMAND Cmd;\r
420 TPM2_SEQUENCE_COMPLETE_RESPONSE Res;\r
421 UINT32 CmdSize;\r
422 UINT32 RespSize;\r
423 UINT8 *BufferPtr;\r
424 UINT32 SessionInfoSize;\r
425 UINT32 ResultBufSize;\r
c1d93242 426\r
c411b485 427 ZeroMem (&Cmd, sizeof (Cmd));\r
c1d93242
JY
428\r
429 //\r
430 // Construct command\r
431 //\r
c411b485
MK
432 Cmd.Header.tag = SwapBytes16 (TPM_ST_SESSIONS);\r
433 Cmd.Header.commandCode = SwapBytes32 (TPM_CC_SequenceComplete);\r
434 Cmd.SequenceHandle = SwapBytes32 (SequenceHandle);\r
c1d93242
JY
435\r
436 //\r
437 // Add in Auth session\r
438 //\r
439 BufferPtr = (UINT8 *)&Cmd.AuthSessionSeq;\r
440\r
441 // sessionInfoSize\r
c411b485
MK
442 SessionInfoSize = CopyAuthSessionCommand (NULL, BufferPtr);\r
443 BufferPtr += SessionInfoSize;\r
444 Cmd.AuthorizationSize = SwapBytes32 (SessionInfoSize);\r
c1d93242
JY
445\r
446 // buffer.size\r
c411b485
MK
447 WriteUnaligned16 ((UINT16 *)BufferPtr, SwapBytes16 (Buffer->size));\r
448 BufferPtr += sizeof (UINT16);\r
c1d93242 449\r
c411b485 450 CopyMem (BufferPtr, &Buffer->buffer[0], Buffer->size);\r
c1d93242
JY
451 BufferPtr += Buffer->size;\r
452\r
453 // Hierarchy\r
454 WriteUnaligned32 ((UINT32 *)BufferPtr, SwapBytes32 (TPM_RH_NULL));\r
455 BufferPtr += sizeof (UINT32);\r
456\r
c411b485
MK
457 CmdSize = (UINT32)(BufferPtr - (UINT8 *)&Cmd);\r
458 Cmd.Header.paramSize = SwapBytes32 (CmdSize);\r
c1d93242
JY
459\r
460 //\r
461 // Call the TPM\r
462 //\r
c411b485
MK
463 ResultBufSize = sizeof (Res);\r
464 Status = Tpm2SubmitCommand (CmdSize, (UINT8 *)&Cmd, &ResultBufSize, (UINT8 *)&Res);\r
465 if (EFI_ERROR (Status)) {\r
c1d93242
JY
466 return Status;\r
467 }\r
468\r
c411b485 469 if (ResultBufSize > sizeof (Res)) {\r
e905fbb0 470 DEBUG ((DEBUG_ERROR, "SequenceComplete: Failed ExecuteCommand: Buffer Too Small\r\n"));\r
c1d93242
JY
471 return EFI_BUFFER_TOO_SMALL;\r
472 }\r
473\r
474 //\r
475 // Validate response headers\r
476 //\r
c411b485
MK
477 RespSize = SwapBytes32 (Res.Header.paramSize);\r
478 if (RespSize > sizeof (Res)) {\r
e905fbb0 479 DEBUG ((DEBUG_ERROR, "SequenceComplete: Response size too large! %d\r\n", RespSize));\r
c1d93242
JY
480 return EFI_BUFFER_TOO_SMALL;\r
481 }\r
482\r
483 //\r
484 // Fail if command failed\r
485 //\r
c411b485
MK
486 if (SwapBytes32 (Res.Header.responseCode) != TPM_RC_SUCCESS) {\r
487 DEBUG ((DEBUG_ERROR, "SequenceComplete: Response Code error! 0x%08x\r\n", SwapBytes32 (Res.Header.responseCode)));\r
c1d93242
JY
488 return EFI_DEVICE_ERROR;\r
489 }\r
490\r
491 //\r
492 // Unmarshal the response\r
493 //\r
494\r
495 BufferPtr = (UINT8 *)&Res.Digest;\r
496\r
497 // digestSize\r
c411b485
MK
498 Result->size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)BufferPtr));\r
499 if (Result->size > sizeof (TPMU_HA)) {\r
dd577319
ZC
500 DEBUG ((DEBUG_ERROR, "Tpm2SequenceComplete - Result->size error %x\n", Result->size));\r
501 return EFI_DEVICE_ERROR;\r
502 }\r
503\r
c411b485 504 BufferPtr += sizeof (UINT16);\r
c1d93242 505\r
c411b485 506 CopyMem (\r
c1d93242
JY
507 Result->buffer,\r
508 BufferPtr,\r
509 Result->size\r
510 );\r
511\r
512 return EFI_SUCCESS;\r
513}\r