]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/Tpm2CommandLib/Tpm2Object.c
SecurityPkg Tpm2DeviceLibDTpm: Update enum type name to match the one in lib
[mirror_edk2.git] / SecurityPkg / Library / Tpm2CommandLib / Tpm2Object.c
CommitLineData
087132a8
JY
1/** @file\r
2 Implement TPM2 Object related command.\r
3\r
dd577319 4Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved. <BR>\r
087132a8
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
15#include <IndustryStandard/UefiTcgPlatform.h>\r
16#include <Library/Tpm2CommandLib.h>\r
17#include <Library/Tpm2DeviceLib.h>\r
18#include <Library/BaseMemoryLib.h>\r
19#include <Library/BaseLib.h>\r
20#include <Library/DebugLib.h>\r
21\r
22#pragma pack(1)\r
23\r
24typedef struct {\r
25 TPM2_COMMAND_HEADER Header;\r
26 TPMI_DH_OBJECT ObjectHandle;\r
27} TPM2_READ_PUBLIC_COMMAND;\r
28\r
29typedef struct {\r
30 TPM2_RESPONSE_HEADER Header;\r
31 TPM2B_PUBLIC OutPublic;\r
32 TPM2B_NAME Name;\r
33 TPM2B_NAME QualifiedName;\r
34} TPM2_READ_PUBLIC_RESPONSE;\r
35\r
36#pragma pack()\r
37\r
38/**\r
39 This command allows access to the public area of a loaded object.\r
40\r
41 @param[in] ObjectHandle TPM handle of an object\r
42 @param[out] OutPublic Structure containing the public area of an object\r
43 @param[out] Name Name of the object\r
44 @param[out] QualifiedName The Qualified Name of the object\r
45\r
46 @retval EFI_SUCCESS Operation completed successfully.\r
47 @retval EFI_DEVICE_ERROR Unexpected device behavior.\r
48**/\r
49EFI_STATUS\r
50EFIAPI\r
51Tpm2ReadPublic (\r
52 IN TPMI_DH_OBJECT ObjectHandle,\r
53 OUT TPM2B_PUBLIC *OutPublic,\r
54 OUT TPM2B_NAME *Name,\r
55 OUT TPM2B_NAME *QualifiedName\r
56 )\r
57{\r
58 EFI_STATUS Status;\r
59 TPM2_READ_PUBLIC_COMMAND SendBuffer;\r
60 TPM2_READ_PUBLIC_RESPONSE RecvBuffer;\r
61 UINT32 SendBufferSize;\r
62 UINT32 RecvBufferSize;\r
63 TPM_RC ResponseCode;\r
64 UINT8 *Buffer;\r
65 UINT16 OutPublicSize;\r
66 UINT16 NameSize;\r
67 UINT16 QualifiedNameSize;\r
68\r
69 //\r
70 // Construct command\r
71 //\r
72 SendBuffer.Header.tag = SwapBytes16(TPM_ST_NO_SESSIONS);\r
73 SendBuffer.Header.commandCode = SwapBytes32(TPM_CC_ReadPublic);\r
74\r
75 SendBuffer.ObjectHandle = SwapBytes32 (ObjectHandle);\r
76\r
77 SendBufferSize = (UINT32) sizeof (SendBuffer);\r
78 SendBuffer.Header.paramSize = SwapBytes32 (SendBufferSize);\r
79\r
80 //\r
81 // send Tpm command\r
82 //\r
83 RecvBufferSize = sizeof (RecvBuffer);\r
84 Status = Tpm2SubmitCommand (SendBufferSize, (UINT8 *)&SendBuffer, &RecvBufferSize, (UINT8 *)&RecvBuffer);\r
85 if (EFI_ERROR (Status)) {\r
86 return Status;\r
87 }\r
88\r
89 if (RecvBufferSize < sizeof (TPM2_RESPONSE_HEADER)) {\r
90 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - RecvBufferSize Error - %x\n", RecvBufferSize));\r
91 return EFI_DEVICE_ERROR;\r
92 }\r
93 ResponseCode = SwapBytes32(RecvBuffer.Header.responseCode);\r
94 if (ResponseCode != TPM_RC_SUCCESS) {\r
95 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - responseCode - %x\n", SwapBytes32(RecvBuffer.Header.responseCode)));\r
96 }\r
97 switch (ResponseCode) {\r
98 case TPM_RC_SUCCESS:\r
99 // return data\r
100 break;\r
101 case TPM_RC_SEQUENCE:\r
102 // objectHandle references a sequence object\r
103 return EFI_INVALID_PARAMETER;\r
104 default:\r
105 return EFI_DEVICE_ERROR;\r
106 }\r
107\r
108 //\r
109 // Basic check\r
110 //\r
111 OutPublicSize = SwapBytes16 (RecvBuffer.OutPublic.size);\r
dd577319
ZC
112 if (OutPublicSize > sizeof(TPMT_PUBLIC)) {\r
113 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - OutPublicSize error %x\n", OutPublicSize));\r
114 return EFI_DEVICE_ERROR;\r
115 }\r
116\r
087132a8
JY
117 NameSize = SwapBytes16 (ReadUnaligned16 ((UINT16 *)((UINT8 *)&RecvBuffer + sizeof(TPM2_RESPONSE_HEADER) +\r
118 sizeof(UINT16) + OutPublicSize)));\r
dd577319
ZC
119 if (NameSize > sizeof(TPMU_NAME)) {\r
120 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - NameSize error %x\n", NameSize));\r
121 return EFI_DEVICE_ERROR;\r
122 }\r
123\r
087132a8
JY
124 QualifiedNameSize = SwapBytes16 (ReadUnaligned16 ((UINT16 *)((UINT8 *)&RecvBuffer + sizeof(TPM2_RESPONSE_HEADER) +\r
125 sizeof(UINT16) + OutPublicSize +\r
126 sizeof(UINT16) + NameSize)));\r
dd577319
ZC
127 if (QualifiedNameSize > sizeof(TPMU_NAME)) {\r
128 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - QualifiedNameSize error %x\n", QualifiedNameSize));\r
129 return EFI_DEVICE_ERROR;\r
130 }\r
087132a8
JY
131\r
132 if (RecvBufferSize != sizeof(TPM2_RESPONSE_HEADER) + sizeof(UINT16) + OutPublicSize + sizeof(UINT16) + NameSize + sizeof(UINT16) + QualifiedNameSize) {\r
133 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - RecvBufferSize %x Error - OutPublicSize %x, NameSize %x, QualifiedNameSize %x\n", RecvBufferSize, OutPublicSize, NameSize, QualifiedNameSize));\r
134 return EFI_DEVICE_ERROR;\r
135 }\r
136\r
137 //\r
138 // Return the response\r
139 //\r
140 Buffer = (UINT8 *)&RecvBuffer.OutPublic;\r
141 CopyMem (OutPublic, &RecvBuffer.OutPublic, sizeof(UINT16) + OutPublicSize);\r
142 OutPublic->size = OutPublicSize;\r
143 OutPublic->publicArea.type = SwapBytes16 (OutPublic->publicArea.type);\r
144 OutPublic->publicArea.nameAlg = SwapBytes16 (OutPublic->publicArea.nameAlg);\r
145 WriteUnaligned32 ((UINT32 *)&OutPublic->publicArea.objectAttributes, SwapBytes32 (ReadUnaligned32 ((UINT32 *)&OutPublic->publicArea.objectAttributes)));\r
146 Buffer = (UINT8 *)&RecvBuffer.OutPublic.publicArea.authPolicy;\r
147 OutPublic->publicArea.authPolicy.size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
148 Buffer += sizeof(UINT16);\r
dd577319
ZC
149 if (OutPublic->publicArea.authPolicy.size > sizeof(TPMU_HA)) {\r
150 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - authPolicy.size error %x\n", OutPublic->publicArea.authPolicy.size));\r
151 return EFI_DEVICE_ERROR;\r
152 }\r
153\r
087132a8
JY
154 CopyMem (OutPublic->publicArea.authPolicy.buffer, Buffer, OutPublic->publicArea.authPolicy.size);\r
155 Buffer += OutPublic->publicArea.authPolicy.size;\r
156\r
157 // TPMU_PUBLIC_PARMS\r
158 switch (OutPublic->publicArea.type) {\r
159 case TPM_ALG_KEYEDHASH:\r
160 OutPublic->publicArea.parameters.keyedHashDetail.scheme.scheme = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
161 Buffer += sizeof(UINT16);\r
162 switch (OutPublic->publicArea.parameters.keyedHashDetail.scheme.scheme) {\r
163 case TPM_ALG_HMAC:\r
164 OutPublic->publicArea.parameters.keyedHashDetail.scheme.details.hmac.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
165 Buffer += sizeof(UINT16);\r
166 break;\r
167 case TPM_ALG_XOR:\r
168 OutPublic->publicArea.parameters.keyedHashDetail.scheme.details.xor.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
169 Buffer += sizeof(UINT16);\r
170 OutPublic->publicArea.parameters.keyedHashDetail.scheme.details.xor.kdf = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
171 Buffer += sizeof(UINT16);\r
172 break;\r
173 default:\r
174 return EFI_UNSUPPORTED;\r
175 }\r
176 case TPM_ALG_SYMCIPHER:\r
177 OutPublic->publicArea.parameters.symDetail.algorithm = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
178 Buffer += sizeof(UINT16);\r
179 switch (OutPublic->publicArea.parameters.symDetail.algorithm) {\r
180 case TPM_ALG_AES:\r
181 OutPublic->publicArea.parameters.symDetail.keyBits.aes = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
182 Buffer += sizeof(UINT16);\r
183 OutPublic->publicArea.parameters.symDetail.mode.aes = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
184 Buffer += sizeof(UINT16);\r
185 break;\r
186 case TPM_ALG_SM4:\r
187 OutPublic->publicArea.parameters.symDetail.keyBits.SM4 = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
188 Buffer += sizeof(UINT16);\r
189 OutPublic->publicArea.parameters.symDetail.mode.SM4 = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
190 Buffer += sizeof(UINT16);\r
191 break;\r
192 case TPM_ALG_XOR:\r
193 OutPublic->publicArea.parameters.symDetail.keyBits.xor = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
194 Buffer += sizeof(UINT16);\r
195 break;\r
196 case TPM_ALG_NULL:\r
197 break;\r
198 default:\r
199 return EFI_UNSUPPORTED;\r
200 }\r
201 break;\r
202 case TPM_ALG_RSA:\r
203 OutPublic->publicArea.parameters.rsaDetail.symmetric.algorithm = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
204 Buffer += sizeof(UINT16);\r
205 switch (OutPublic->publicArea.parameters.rsaDetail.symmetric.algorithm) {\r
206 case TPM_ALG_AES:\r
207 OutPublic->publicArea.parameters.rsaDetail.symmetric.keyBits.aes = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
208 Buffer += sizeof(UINT16);\r
209 OutPublic->publicArea.parameters.rsaDetail.symmetric.mode.aes = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
210 Buffer += sizeof(UINT16);\r
211 break;\r
212 case TPM_ALG_SM4:\r
213 OutPublic->publicArea.parameters.rsaDetail.symmetric.keyBits.SM4 = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
214 Buffer += sizeof(UINT16);\r
215 OutPublic->publicArea.parameters.rsaDetail.symmetric.mode.SM4 = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
216 Buffer += sizeof(UINT16);\r
217 break;\r
218 case TPM_ALG_NULL:\r
219 break;\r
220 default:\r
221 return EFI_UNSUPPORTED;\r
222 }\r
223 OutPublic->publicArea.parameters.rsaDetail.scheme.scheme = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
224 Buffer += sizeof(UINT16);\r
225 switch (OutPublic->publicArea.parameters.rsaDetail.scheme.scheme) {\r
226 case TPM_ALG_RSASSA:\r
227 OutPublic->publicArea.parameters.rsaDetail.scheme.details.rsassa.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
228 Buffer += sizeof(UINT16);\r
229 break;\r
230 case TPM_ALG_RSAPSS:\r
231 OutPublic->publicArea.parameters.rsaDetail.scheme.details.rsapss.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
232 Buffer += sizeof(UINT16);\r
233 break;\r
234 case TPM_ALG_RSAES:\r
235 break;\r
236 case TPM_ALG_OAEP:\r
237 OutPublic->publicArea.parameters.rsaDetail.scheme.details.oaep.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
238 Buffer += sizeof(UINT16);\r
239 break;\r
240 case TPM_ALG_NULL:\r
241 break;\r
242 default:\r
243 return EFI_UNSUPPORTED;\r
244 }\r
245 OutPublic->publicArea.parameters.rsaDetail.keyBits = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
246 Buffer += sizeof(UINT16);\r
247 OutPublic->publicArea.parameters.rsaDetail.exponent = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
248 Buffer += sizeof(UINT32);\r
249 break;\r
250 case TPM_ALG_ECC:\r
251 OutPublic->publicArea.parameters.eccDetail.symmetric.algorithm = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
252 Buffer += sizeof(UINT16);\r
253 switch (OutPublic->publicArea.parameters.eccDetail.symmetric.algorithm) {\r
254 case TPM_ALG_AES:\r
255 OutPublic->publicArea.parameters.eccDetail.symmetric.keyBits.aes = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
256 Buffer += sizeof(UINT16);\r
257 OutPublic->publicArea.parameters.eccDetail.symmetric.mode.aes = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
258 Buffer += sizeof(UINT16);\r
259 break;\r
260 case TPM_ALG_SM4:\r
261 OutPublic->publicArea.parameters.eccDetail.symmetric.keyBits.SM4 = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
262 Buffer += sizeof(UINT16);\r
263 OutPublic->publicArea.parameters.eccDetail.symmetric.mode.SM4 = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
264 Buffer += sizeof(UINT16);\r
265 break;\r
266 case TPM_ALG_NULL:\r
267 break;\r
268 default:\r
269 return EFI_UNSUPPORTED;\r
270 }\r
271 OutPublic->publicArea.parameters.eccDetail.scheme.scheme = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
272 Buffer += sizeof(UINT16);\r
273 switch (OutPublic->publicArea.parameters.eccDetail.scheme.scheme) {\r
274 case TPM_ALG_ECDSA:\r
275 OutPublic->publicArea.parameters.eccDetail.scheme.details.ecdsa.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
276 Buffer += sizeof(UINT16);\r
277 break;\r
278 case TPM_ALG_ECDAA:\r
279 OutPublic->publicArea.parameters.eccDetail.scheme.details.ecdaa.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
280 Buffer += sizeof(UINT16);\r
281 break;\r
282 case TPM_ALG_ECSCHNORR:\r
283 OutPublic->publicArea.parameters.eccDetail.scheme.details.ecSchnorr.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
284 Buffer += sizeof(UINT16);\r
285 break;\r
286 case TPM_ALG_ECDH:\r
287 break;\r
288 case TPM_ALG_NULL:\r
289 break;\r
290 default:\r
291 return EFI_UNSUPPORTED;\r
292 }\r
293 OutPublic->publicArea.parameters.eccDetail.curveID = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
294 Buffer += sizeof(UINT16);\r
295 OutPublic->publicArea.parameters.eccDetail.kdf.scheme = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
296 Buffer += sizeof(UINT16);\r
297 switch (OutPublic->publicArea.parameters.eccDetail.kdf.scheme) {\r
298 case TPM_ALG_MGF1:\r
299 OutPublic->publicArea.parameters.eccDetail.kdf.details.mgf1.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
300 Buffer += sizeof(UINT16);\r
301 break;\r
302 case TPM_ALG_KDF1_SP800_108:\r
303 OutPublic->publicArea.parameters.eccDetail.kdf.details.kdf1_sp800_108.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
304 Buffer += sizeof(UINT16);\r
305 break;\r
306 case TPM_ALG_KDF1_SP800_56a:\r
307 OutPublic->publicArea.parameters.eccDetail.kdf.details.kdf1_SP800_56a.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
308 Buffer += sizeof(UINT16);\r
309 break;\r
310 case TPM_ALG_KDF2:\r
311 OutPublic->publicArea.parameters.eccDetail.kdf.details.kdf2.hashAlg = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
312 Buffer += sizeof(UINT16);\r
313 break;\r
314 case TPM_ALG_NULL:\r
315 break;\r
316 default:\r
317 return EFI_UNSUPPORTED;\r
318 }\r
319 break;\r
320 default:\r
321 return EFI_UNSUPPORTED;\r
322 }\r
323\r
324 // TPMU_PUBLIC_ID\r
325 switch (OutPublic->publicArea.type) {\r
326 case TPM_ALG_KEYEDHASH:\r
327 OutPublic->publicArea.unique.keyedHash.size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
328 Buffer += sizeof(UINT16);\r
dd577319
ZC
329 if(OutPublic->publicArea.unique.keyedHash.size > sizeof(TPMU_HA)) {\r
330 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - keyedHash.size error %x\n", OutPublic->publicArea.unique.keyedHash.size));\r
331 return EFI_DEVICE_ERROR;\r
332 }\r
087132a8
JY
333 CopyMem (OutPublic->publicArea.unique.keyedHash.buffer, Buffer, OutPublic->publicArea.unique.keyedHash.size);\r
334 Buffer += OutPublic->publicArea.unique.keyedHash.size;\r
335 break;\r
336 case TPM_ALG_SYMCIPHER:\r
337 OutPublic->publicArea.unique.sym.size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
338 Buffer += sizeof(UINT16);\r
dd577319
ZC
339 if(OutPublic->publicArea.unique.sym.size > sizeof(TPMU_HA)) {\r
340 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - sym.size error %x\n", OutPublic->publicArea.unique.sym.size));\r
341 return EFI_DEVICE_ERROR;\r
342 }\r
087132a8
JY
343 CopyMem (OutPublic->publicArea.unique.sym.buffer, Buffer, OutPublic->publicArea.unique.sym.size);\r
344 Buffer += OutPublic->publicArea.unique.sym.size;\r
345 break;\r
346 case TPM_ALG_RSA:\r
347 OutPublic->publicArea.unique.rsa.size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
348 Buffer += sizeof(UINT16);\r
dd577319
ZC
349 if(OutPublic->publicArea.unique.rsa.size > MAX_RSA_KEY_BYTES) {\r
350 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - rsa.size error %x\n", OutPublic->publicArea.unique.rsa.size));\r
351 return EFI_DEVICE_ERROR;\r
352 }\r
087132a8
JY
353 CopyMem (OutPublic->publicArea.unique.rsa.buffer, Buffer, OutPublic->publicArea.unique.rsa.size);\r
354 Buffer += OutPublic->publicArea.unique.rsa.size;\r
355 break;\r
356 case TPM_ALG_ECC:\r
357 OutPublic->publicArea.unique.ecc.x.size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
358 Buffer += sizeof(UINT16);\r
dd577319
ZC
359 if (OutPublic->publicArea.unique.ecc.x.size > MAX_ECC_KEY_BYTES) {\r
360 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - ecc.x.size error %x\n", OutPublic->publicArea.unique.ecc.x.size));\r
361 return EFI_DEVICE_ERROR;\r
362 }\r
087132a8
JY
363 CopyMem (OutPublic->publicArea.unique.ecc.x.buffer, Buffer, OutPublic->publicArea.unique.ecc.x.size);\r
364 Buffer += OutPublic->publicArea.unique.ecc.x.size;\r
365 OutPublic->publicArea.unique.ecc.y.size = SwapBytes16 (ReadUnaligned16 ((UINT16 *)Buffer));\r
366 Buffer += sizeof(UINT16);\r
dd577319
ZC
367 if (OutPublic->publicArea.unique.ecc.y.size > MAX_ECC_KEY_BYTES) {\r
368 DEBUG ((DEBUG_ERROR, "Tpm2ReadPublic - ecc.y.size error %x\n", OutPublic->publicArea.unique.ecc.y.size));\r
369 return EFI_DEVICE_ERROR;\r
370 }\r
087132a8
JY
371 CopyMem (OutPublic->publicArea.unique.ecc.y.buffer, Buffer, OutPublic->publicArea.unique.ecc.y.size);\r
372 Buffer += OutPublic->publicArea.unique.ecc.y.size;\r
373 break;\r
374 default:\r
375 return EFI_UNSUPPORTED;\r
376 }\r
377\r
378 CopyMem (Name->name, (UINT8 *)&RecvBuffer + sizeof(TPM2_RESPONSE_HEADER) + sizeof(UINT16) + OutPublicSize + sizeof(UINT16), NameSize);\r
379 Name->size = NameSize;\r
380\r
381 CopyMem (QualifiedName->name, (UINT8 *)&RecvBuffer + sizeof(TPM2_RESPONSE_HEADER) + sizeof(UINT16) + OutPublicSize + sizeof(UINT16) + NameSize + sizeof(UINT16), QualifiedNameSize);\r
382 QualifiedName->size = QualifiedNameSize;\r
383\r
384 return EFI_SUCCESS;\r
385}\r