]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Library/TcgStorageCoreLib/TcgStorageUtil.c
SecurityPkg: Apply uncrustify changes
[mirror_edk2.git] / SecurityPkg / Library / TcgStorageCoreLib / TcgStorageUtil.c
CommitLineData
085dcf01
ED
1/** @file\r
2 Provide functions to provide tcg storage core spec related functions.\r
3\r
4Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
289b714b 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
085dcf01
ED
6\r
7**/\r
8\r
9#include <Library/TcgStorageCoreLib.h>\r
10\r
11#include <Library/BaseLib.h>\r
12#include <Library/BaseMemoryLib.h>\r
13#include <Library/DebugLib.h>\r
14\r
15typedef struct {\r
c411b485
MK
16 UINT16 FeatureCode;\r
17 TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER *Feature;\r
18 UINTN FeatureSize;\r
085dcf01
ED
19} TCG_FIND_FEATURE_CTX;\r
20\r
21/**\r
22 Returns a human-readable string representing a method status return code.\r
23\r
24 @param[in] MethodStatus Method status to translate to a string\r
25\r
26\r
27 @retval return the string info.\r
28**/\r
c411b485 29CHAR8 *\r
085dcf01 30EFIAPI\r
c411b485
MK
31TcgMethodStatusString (\r
32 UINT8 MethodStatus\r
085dcf01
ED
33 )\r
34{\r
35 switch (MethodStatus) {\r
c411b485
MK
36 #define C(status) case TCG_METHOD_STATUS_CODE_ ## status: return #status\r
37 C (SUCCESS);\r
38 C (NOT_AUTHORIZED);\r
39 C (OBSOLETE);\r
40 C (SP_BUSY);\r
41 C (SP_FAILED);\r
42 C (SP_DISABLED);\r
43 C (SP_FROZEN);\r
44 C (NO_SESSIONS_AVAILABLE);\r
45 C (UNIQUENESS_CONFLICT);\r
46 C (INSUFFICIENT_SPACE);\r
47 C (INSUFFICIENT_ROWS);\r
48 C (INVALID_PARAMETER);\r
49 C (OBSOLETE2);\r
50 C (OBSOLETE3);\r
51 C (TPER_MALFUNCTION);\r
52 C (TRANSACTION_FAILURE);\r
53 C (RESPONSE_OVERFLOW);\r
54 C (AUTHORITY_LOCKED_OUT);\r
55 C (FAIL);\r
085dcf01
ED
56 #undef C\r
57 }\r
c411b485 58\r
085dcf01
ED
59 return "unknown";\r
60}\r
61\r
085dcf01
ED
62/**\r
63 adds call token and method Header (invoking id, and method id).\r
64\r
65 @param CreateStruct The input create structure.\r
66 @param InvokingId Invoking id.\r
67 @param MethodId Method id.\r
68\r
69**/\r
70TCG_RESULT\r
71EFIAPI\r
c411b485
MK
72TcgStartMethodCall (\r
73 TCG_CREATE_STRUCT *CreateStruct,\r
74 TCG_UID InvokingId,\r
75 TCG_UID MethodId\r
085dcf01
ED
76 )\r
77{\r
c411b485 78 NULL_CHECK (CreateStruct);\r
085dcf01 79\r
c411b485
MK
80 if ((CreateStruct->ComPacket == NULL) ||\r
81 (CreateStruct->CurPacket == NULL) ||\r
82 (CreateStruct->CurSubPacket == NULL)\r
83 )\r
84 {\r
085dcf01
ED
85 DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket, CreateStruct->CurSubPacket));\r
86 return (TcgResultFailureInvalidAction);\r
87 }\r
88\r
c411b485
MK
89 ERROR_CHECK (TcgAddCall (CreateStruct));\r
90 ERROR_CHECK (TcgAddTcgUid (CreateStruct, InvokingId));\r
91 ERROR_CHECK (TcgAddTcgUid (CreateStruct, MethodId));\r
085dcf01
ED
92\r
93 return TcgResultSuccess;\r
94}\r
95\r
96/**\r
97 Adds START LIST token.\r
98\r
99 @param CreateStruct The input create structure.\r
100\r
101**/\r
102TCG_RESULT\r
103EFIAPI\r
c411b485
MK
104TcgStartParameters (\r
105 TCG_CREATE_STRUCT *CreateStruct\r
085dcf01
ED
106 )\r
107{\r
c411b485 108 NULL_CHECK (CreateStruct);\r
085dcf01 109\r
c411b485
MK
110 if ((CreateStruct->ComPacket == NULL) ||\r
111 (CreateStruct->CurPacket == NULL) ||\r
112 (CreateStruct->CurSubPacket == NULL)\r
113 )\r
114 {\r
085dcf01
ED
115 DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket, CreateStruct->CurSubPacket));\r
116 return (TcgResultFailureInvalidAction);\r
117 }\r
118\r
c411b485 119 return TcgAddStartList (CreateStruct);\r
085dcf01
ED
120}\r
121\r
122/**\r
123 Adds END LIST token.\r
124\r
125 @param CreateStruct The input create structure.\r
126\r
127**/\r
128TCG_RESULT\r
129EFIAPI\r
c411b485
MK
130TcgEndParameters (\r
131 TCG_CREATE_STRUCT *CreateStruct\r
085dcf01
ED
132 )\r
133{\r
c411b485 134 NULL_CHECK (CreateStruct);\r
085dcf01 135\r
c411b485
MK
136 if ((CreateStruct->ComPacket == NULL) ||\r
137 (CreateStruct->CurPacket == NULL) ||\r
138 (CreateStruct->CurSubPacket == NULL)\r
139 )\r
140 {\r
085dcf01
ED
141 DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket, CreateStruct->CurSubPacket));\r
142 return (TcgResultFailureInvalidAction);\r
143 }\r
144\r
c411b485 145 return TcgAddEndList (CreateStruct);\r
085dcf01
ED
146}\r
147\r
148/**\r
149 Adds END Data token and method list.\r
150\r
151 @param CreateStruct The input create structure.\r
152\r
153**/\r
154TCG_RESULT\r
155EFIAPI\r
c411b485
MK
156TcgEndMethodCall (\r
157 TCG_CREATE_STRUCT *CreateStruct\r
085dcf01
ED
158 )\r
159{\r
c411b485 160 NULL_CHECK (CreateStruct);\r
085dcf01 161\r
c411b485
MK
162 if ((CreateStruct->ComPacket == NULL) ||\r
163 (CreateStruct->CurPacket == NULL) ||\r
164 (CreateStruct->CurSubPacket == NULL)\r
165 )\r
166 {\r
085dcf01
ED
167 DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket, CreateStruct->CurSubPacket));\r
168 return (TcgResultFailureInvalidAction);\r
169 }\r
170\r
c411b485 171 ERROR_CHECK (TcgAddEndOfData (CreateStruct));\r
085dcf01 172\r
c411b485
MK
173 ERROR_CHECK (TcgAddStartList (CreateStruct));\r
174 ERROR_CHECK (TcgAddUINT8 (CreateStruct, 0x00)); // expected to complete properly\r
175 ERROR_CHECK (TcgAddUINT8 (CreateStruct, 0x00)); // reserved\r
176 ERROR_CHECK (TcgAddUINT8 (CreateStruct, 0x00)); // reserved\r
177 ERROR_CHECK (TcgAddEndList (CreateStruct));\r
085dcf01
ED
178\r
179 return TcgResultSuccess;\r
180}\r
181\r
182/**\r
183 Retrieves the comID and Extended comID of the ComPacket in the Tcg response.\r
184 It is intended to be used to confirm the received Tcg response is intended for user that received it.\r
185\r
186 @param [in] ParseStruct Structure used to parse received TCG response.\r
187 @param [in/out] ComId comID retrieved from received ComPacket.\r
188 @param [in/out] ComIdExtension Extended comID retrieved from received ComPacket\r
189\r
190**/\r
191TCG_RESULT\r
192EFIAPI\r
c411b485
MK
193TcgGetComIds (\r
194 const TCG_PARSE_STRUCT *ParseStruct,\r
195 UINT16 *ComId,\r
196 UINT16 *ComIdExtension\r
085dcf01
ED
197 )\r
198{\r
c411b485
MK
199 NULL_CHECK (ParseStruct);\r
200 NULL_CHECK (ComId);\r
201 NULL_CHECK (ComIdExtension);\r
085dcf01
ED
202\r
203 if (ParseStruct->ComPacket == NULL) {\r
204 DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p\n", ParseStruct->ComPacket));\r
205 return TcgResultFailureInvalidAction;\r
206 }\r
207\r
c411b485
MK
208 *ComId = SwapBytes16 (ParseStruct->ComPacket->ComIDBE);\r
209 *ComIdExtension = SwapBytes16 (ParseStruct->ComPacket->ComIDExtensionBE);\r
085dcf01
ED
210\r
211 return TcgResultSuccess;\r
212}\r
213\r
214/**\r
215 Checks if the ComIDs of the response match the expected values.\r
216\r
217 @param[in] ParseStruct Structure used to parse received TCG response\r
218 @param[in] ExpectedComId Expected comID\r
219 @param[in] ExpectedComIdExtension Expected extended comID\r
220\r
221**/\r
222TCG_RESULT\r
223EFIAPI\r
c411b485
MK
224TcgCheckComIds (\r
225 const TCG_PARSE_STRUCT *ParseStruct,\r
226 UINT16 ExpectedComId,\r
227 UINT16 ExpectedComIdExtension\r
085dcf01
ED
228 )\r
229{\r
c411b485
MK
230 UINT16 ParseComId;\r
231 UINT16 ParseComIdExtension;\r
085dcf01 232\r
c411b485
MK
233 ERROR_CHECK (TcgGetComIds (ParseStruct, &ParseComId, &ParseComIdExtension));\r
234 if ((ParseComId != ExpectedComId) || (ParseComIdExtension != ExpectedComIdExtension)) {\r
085dcf01
ED
235 DEBUG ((DEBUG_INFO, "Com ID: Actual 0x%02X Expected 0x%02X\n", ParseComId, ExpectedComId));\r
236 DEBUG ((DEBUG_INFO, "Extended Com ID: 0x%02X Expected 0x%02X\n", ParseComIdExtension, ExpectedComIdExtension));\r
237 return TcgResultFailure;\r
238 }\r
c411b485 239\r
085dcf01
ED
240 return TcgResultSuccess;\r
241}\r
242\r
243/**\r
244 Returns the method status of the current subpacket. Does not affect the current position\r
245 in the ComPacket. In other words, it can be called whenever you have a valid SubPacket.\r
246\r
247 @param [in/out] ParseStruct Structure used to parse received TCG response\r
248 @param [in/out] MethodStatus Method status retrieved of the current SubPacket\r
249\r
250**/\r
251TCG_RESULT\r
252EFIAPI\r
c411b485
MK
253TcgGetMethodStatus (\r
254 const TCG_PARSE_STRUCT *ParseStruct,\r
255 UINT8 *MethodStatus\r
085dcf01
ED
256 )\r
257{\r
c411b485
MK
258 TCG_PARSE_STRUCT TmpParseStruct;\r
259 TCG_TOKEN TcgToken;\r
260 UINT8 Reserved1, Reserved2;\r
261\r
262 NULL_CHECK (ParseStruct);\r
263 NULL_CHECK (MethodStatus);\r
264\r
265 if ((ParseStruct->ComPacket == NULL) ||\r
266 (ParseStruct->CurPacket == NULL) ||\r
267 (ParseStruct->CurSubPacket == NULL)\r
268 )\r
269 {\r
085dcf01
ED
270 DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", ParseStruct->ComPacket, ParseStruct->CurPacket, ParseStruct->CurSubPacket));\r
271 return TcgResultFailureInvalidAction;\r
272 }\r
273\r
274 // duplicate ParseStruct, then don't need to "reset" location cur ptr\r
c411b485 275 CopyMem (&TmpParseStruct, ParseStruct, sizeof (TCG_PARSE_STRUCT));\r
085dcf01
ED
276\r
277 // method status list exists after the end method call in the subpacket\r
278 // skip tokens until ENDDATA is found\r
279 do {\r
c411b485 280 ERROR_CHECK (TcgGetNextToken (&TmpParseStruct, &TcgToken));\r
085dcf01
ED
281 } while (TcgToken.Type != TcgTokenTypeEndOfData);\r
282\r
283 // only reach here if enddata is found\r
284 // at this point, the curptr is pointing at method status list beginning\r
c411b485
MK
285 ERROR_CHECK (TcgGetNextStartList (&TmpParseStruct));\r
286 ERROR_CHECK (TcgGetNextUINT8 (&TmpParseStruct, MethodStatus));\r
287 ERROR_CHECK (TcgGetNextUINT8 (&TmpParseStruct, &Reserved1));\r
288 ERROR_CHECK (TcgGetNextUINT8 (&TmpParseStruct, &Reserved2));\r
289 ERROR_CHECK (TcgGetNextEndList (&TmpParseStruct));\r
085dcf01
ED
290\r
291 if (Reserved1 != 0) {\r
292 DEBUG ((DEBUG_INFO, "Method status reserved1 = 0x%02X (expected 0)\n", Reserved1));\r
293 return TcgResultFailure;\r
294 }\r
295\r
296 if (Reserved2 != 0) {\r
297 DEBUG ((DEBUG_INFO, "Method status reserved2 = 0x%02X (expected 0)\n", Reserved1));\r
298 return TcgResultFailure;\r
299 }\r
300\r
301 return TcgResultSuccess;\r
302}\r
303\r
304/**\r
305 Return the toke type string info.\r
306\r
307 @param Type Input the type info.\r
308\r
309 @retval Return the string for this type.\r
310\r
311**/\r
c411b485 312CHAR8 *\r
085dcf01 313EFIAPI\r
c411b485 314TcgTokenTypeString (\r
085dcf01
ED
315 TCG_TOKEN_TYPE Type\r
316 )\r
317{\r
318 switch (Type) {\r
319 case TcgTokenTypeReserved: return "Reserved";\r
320 case TcgTokenTypeTinyAtom: return "Tiny Atom";\r
321 case TcgTokenTypeShortAtom: return "Short Atom";\r
322 case TcgTokenTypeMediumAtom: return "Medium Atom";\r
323 case TcgTokenTypeLongAtom: return "Long Atom";\r
324 case TcgTokenTypeStartList: return "Start List";\r
325 case TcgTokenTypeEndList: return "End List";\r
326 case TcgTokenTypeStartName: return "Start Name";\r
327 case TcgTokenTypeEndName: return "End Name";\r
328 case TcgTokenTypeCall: return "Call";\r
329 case TcgTokenTypeEndOfData: return "End of Data";\r
330 case TcgTokenTypeEndOfSession: return "End of Session";\r
331 case TcgTokenTypeStartTransaction: return "Start Transaction";\r
332 case TcgTokenTypeEndTransaction: return "End Transaction";\r
333 case TcgTokenTypeEmptyAtom: return "Empty atom";\r
334 }\r
c411b485 335\r
085dcf01
ED
336 return "Unknown";\r
337}\r
338\r
085dcf01
ED
339/**\r
340\r
341 Adds Start Session call to the data structure. This creates the entire ComPacket structure and\r
342 returns the size of the entire compacket in the size parameter.\r
343\r
344 @param [in/out] CreateStruct Structure used to add the start session call\r
345 @param [in/out] Size Describes the size of the entire ComPacket (header and payload). Filled out by function.\r
346 @param [in] ComId ComID for the ComPacket\r
347 @param [in] ComIdExtension Extended ComID for the ComPacket\r
348 @param [in] HostSessionId Host Session ID\r
349 @param [in] SpId Security Provider to start session with\r
350 @param [in] Write Write option for start session. TRUE = start session requests write access\r
351 @param [in] HostChallengeLength Length of the host challenge. Length should be 0 if hostChallenge is NULL\r
352 @param [in] HostChallenge Host challenge for Host Signing Authority. If NULL, then no Host Challenge shall be sent.\r
353 @param [in] HostSigningAuthority Host Signing Authority used for start session. If NULL, then no Host Signing Authority shall be sent.\r
354\r
355**/\r
356TCG_RESULT\r
357EFIAPI\r
c411b485
MK
358TcgCreateStartSession (\r
359 TCG_CREATE_STRUCT *CreateStruct,\r
360 UINT32 *Size,\r
361 UINT16 ComId,\r
362 UINT16 ComIdExtension,\r
363 UINT32 HostSessionId,\r
364 TCG_UID SpId,\r
365 BOOLEAN Write,\r
366 UINT32 HostChallengeLength,\r
367 const VOID *HostChallenge,\r
368 TCG_UID HostSigningAuthority\r
085dcf01
ED
369 )\r
370{\r
c411b485
MK
371 ERROR_CHECK (TcgStartComPacket (CreateStruct, ComId, ComIdExtension));\r
372 ERROR_CHECK (TcgStartPacket (CreateStruct, 0x0, 0x0, 0x0, 0x0, 0x0));\r
373 ERROR_CHECK (TcgStartSubPacket (CreateStruct, 0x0));\r
374 ERROR_CHECK (TcgStartMethodCall (CreateStruct, TCG_UID_SMUID, TCG_UID_SM_START_SESSION));\r
375 ERROR_CHECK (TcgStartParameters (CreateStruct));\r
376 ERROR_CHECK (TcgAddUINT32 (CreateStruct, HostSessionId));\r
377 ERROR_CHECK (TcgAddTcgUid (CreateStruct, SpId));\r
378 ERROR_CHECK (TcgAddBOOLEAN (CreateStruct, Write));\r
085dcf01
ED
379\r
380 // optional parameters\r
c411b485
MK
381 if ((HostChallenge != NULL) && (HostChallengeLength != 0)) {\r
382 ERROR_CHECK (TcgAddStartName (CreateStruct));\r
383 ERROR_CHECK (TcgAddUINT8 (CreateStruct, 0x00)); // TODO Create Enum for Method Optional Parameters?\r
384 ERROR_CHECK (TcgAddByteSequence (CreateStruct, HostChallenge, HostChallengeLength, FALSE));\r
385 ERROR_CHECK (TcgAddEndName (CreateStruct));\r
085dcf01 386 }\r
c411b485 387\r
085dcf01
ED
388 // optional parameters\r
389 if (HostSigningAuthority != 0) {\r
c411b485
MK
390 ERROR_CHECK (TcgAddStartName (CreateStruct));\r
391 ERROR_CHECK (TcgAddUINT8 (CreateStruct, 0x03)); // TODO Create Enum for Method Optional Parameters?\r
392 ERROR_CHECK (TcgAddTcgUid (CreateStruct, HostSigningAuthority));\r
393 ERROR_CHECK (TcgAddEndName (CreateStruct));\r
085dcf01
ED
394 }\r
395\r
c411b485
MK
396 ERROR_CHECK (TcgEndParameters (CreateStruct));\r
397 ERROR_CHECK (TcgEndMethodCall (CreateStruct));\r
398 ERROR_CHECK (TcgEndSubPacket (CreateStruct));\r
399 ERROR_CHECK (TcgEndPacket (CreateStruct));\r
400 ERROR_CHECK (TcgEndComPacket (CreateStruct, Size));\r
085dcf01
ED
401\r
402 return TcgResultSuccess;\r
403}\r
404\r
405/**\r
406 Parses the Sync Session response contained in the parseStruct to retrieve Tper session ID. If the Sync Session response\r
407 parameters do not match the comID, extended ComID and host session ID then a failure is returned.\r
408\r
409 @param[in/out] ParseStruct Structure used to parse received TCG response, contains Sync Session response.\r
410 @param[in] ComId Expected ComID that is compared to actual ComID of response\r
411 @param[in] ComIdExtension Expected Extended ComID that is compared to actual Extended ComID of response\r
412 @param[in] HostSessionId Expected Host Session ID that is compared to actual Host Session ID of response\r
413 @param[in/out] TperSessionId Tper Session ID retrieved from the Sync Session response.\r
414\r
415**/\r
416TCG_RESULT\r
417EFIAPI\r
c411b485 418TcgParseSyncSession (\r
085dcf01
ED
419 const TCG_PARSE_STRUCT *ParseStruct,\r
420 UINT16 ComId,\r
421 UINT16 ComIdExtension,\r
422 UINT32 HostSessionId,\r
423 UINT32 *TperSessionId\r
424 )\r
425{\r
c411b485
MK
426 UINT8 MethodStatus;\r
427 TCG_PARSE_STRUCT TmpParseStruct;\r
428 UINT16 ParseComId;\r
429 UINT16 ParseExtComId;\r
430 TCG_UID InvokingUID;\r
431 TCG_UID MethodUID;\r
432 UINT32 RecvHostSessionId;\r
085dcf01 433\r
c411b485
MK
434 NULL_CHECK (ParseStruct);\r
435 NULL_CHECK (TperSessionId);\r
085dcf01 436\r
c411b485 437 CopyMem (&TmpParseStruct, ParseStruct, sizeof (TCG_PARSE_STRUCT));\r
085dcf01
ED
438\r
439 // verify method status is good\r
c411b485 440 ERROR_CHECK (TcgGetMethodStatus (&TmpParseStruct, &MethodStatus));\r
085dcf01
ED
441 METHOD_STATUS_ERROR_CHECK (MethodStatus, TcgResultFailure);\r
442\r
443 // verify comids\r
c411b485 444 ERROR_CHECK (TcgGetComIds (&TmpParseStruct, &ParseComId, &ParseExtComId));\r
085dcf01
ED
445\r
446 if ((ComId != ParseComId) || (ComIdExtension != ParseExtComId)) {\r
447 DEBUG ((DEBUG_INFO, "unmatched comid (exp: 0x%X recv: 0x%X) or comid extension (exp: 0x%X recv: 0x%X)\n", ComId, ParseComId, ComIdExtension, ParseExtComId));\r
448 return TcgResultFailure;\r
449 }\r
c411b485
MK
450\r
451 ERROR_CHECK (TcgGetNextCall (&TmpParseStruct));\r
452 ERROR_CHECK (TcgGetNextTcgUid (&TmpParseStruct, &InvokingUID));\r
453 ERROR_CHECK (TcgGetNextTcgUid (&TmpParseStruct, &MethodUID));\r
454 ERROR_CHECK (TcgGetNextStartList (&TmpParseStruct));\r
455 ERROR_CHECK (TcgGetNextUINT32 (&TmpParseStruct, &RecvHostSessionId));\r
456 ERROR_CHECK (TcgGetNextUINT32 (&TmpParseStruct, TperSessionId));\r
457 ERROR_CHECK (TcgGetNextEndList (&TmpParseStruct));\r
458 ERROR_CHECK (TcgGetNextEndOfData (&TmpParseStruct));\r
085dcf01
ED
459\r
460 if (InvokingUID != TCG_UID_SMUID) {\r
461 DEBUG ((DEBUG_INFO, "Invoking UID did not match UID_SMUID\n"));\r
462 return TcgResultFailure;\r
463 }\r
464\r
465 if (MethodUID != TCG_UID_SM_SYNC_SESSION) {\r
466 DEBUG ((DEBUG_INFO, "Method UID did not match UID_SM_SYNC_SESSION\n"));\r
467 return TcgResultFailure;\r
468 }\r
469\r
470 if (HostSessionId != RecvHostSessionId) {\r
471 DEBUG ((DEBUG_INFO, "unmatched HostSessionId (exp: 0x%X recv: 0x%X)\n", HostSessionId, RecvHostSessionId));\r
472 return TcgResultFailure;\r
473 }\r
474\r
475 return TcgResultSuccess;\r
476}\r
477\r
478/**\r
479\r
480 Creates ComPacket with EndSession.\r
481 This assumes a start session has already been opened.\r
482\r
483 @param [in/out] CreateStruct Structure used to add Endsession\r
484 @param [in/out] Size Describes the size of the entire ComPacket (header and payload). Filled out by function.\r
485 @param [in] ComId ComID for the ComPacket\r
486 @param [in] ComIdExtension Extended ComID for the ComPacket\r
487 @param [in] HostSessionId Host Session ID for the Packet\r
488 @param [in] TpSessionId Tper Session ID for the Packet\r
489\r
490**/\r
491TCG_RESULT\r
492EFIAPI\r
c411b485
MK
493TcgCreateEndSession (\r
494 TCG_CREATE_STRUCT *CreateStruct,\r
495 UINT32 *Size,\r
496 UINT16 ComId,\r
497 UINT16 ComIdExtension,\r
498 UINT32 HostSessionId,\r
499 UINT32 TpSessionId\r
085dcf01
ED
500 )\r
501{\r
c411b485
MK
502 ERROR_CHECK (TcgStartComPacket (CreateStruct, ComId, ComIdExtension));\r
503 ERROR_CHECK (TcgStartPacket (CreateStruct, TpSessionId, HostSessionId, 0x0, 0x0, 0x0));\r
504 ERROR_CHECK (TcgStartSubPacket (CreateStruct, 0x0));\r
505 ERROR_CHECK (TcgAddEndOfSession (CreateStruct));\r
506 ERROR_CHECK (TcgEndSubPacket (CreateStruct));\r
507 ERROR_CHECK (TcgEndPacket (CreateStruct));\r
508 ERROR_CHECK (TcgEndComPacket (CreateStruct, Size));\r
085dcf01
ED
509\r
510 return TcgResultSuccess;\r
511}\r
512\r
513/**\r
514 Set start method.\r
515\r
516 @param CreateStruct Input create structure.\r
517 @param Row Input the row info.\r
518 @param ColumnNumber the column info.\r
519\r
520**/\r
521TCG_RESULT\r
522EFIAPI\r
c411b485
MK
523TcgStartMethodSet (\r
524 TCG_CREATE_STRUCT *CreateStruct,\r
525 TCG_UID Row,\r
526 UINT32 ColumnNumber\r
085dcf01
ED
527 )\r
528{\r
c411b485
MK
529 ERROR_CHECK (TcgStartMethodCall (CreateStruct, Row, TCG_UID_METHOD_SET));\r
530 ERROR_CHECK (TcgStartParameters (CreateStruct));\r
531 ERROR_CHECK (TcgAddStartName (CreateStruct));\r
532 ERROR_CHECK (TcgAddUINT8 (CreateStruct, 0x01)); // "Values"\r
533 ERROR_CHECK (TcgAddStartList (CreateStruct));\r
534 ERROR_CHECK (TcgAddStartName (CreateStruct));\r
535 ERROR_CHECK (TcgAddUINT32 (CreateStruct, ColumnNumber));\r
085dcf01
ED
536 return TcgResultSuccess;\r
537}\r
538\r
539/**\r
540 Set end method.\r
541\r
542 @param CreateStruct Input create structure.\r
543\r
544**/\r
545TCG_RESULT\r
546EFIAPI\r
c411b485
MK
547TcgEndMethodSet (\r
548 TCG_CREATE_STRUCT *CreateStruct\r
085dcf01
ED
549 )\r
550{\r
c411b485
MK
551 ERROR_CHECK (TcgAddEndName (CreateStruct));\r
552 ERROR_CHECK (TcgAddEndList (CreateStruct));\r
553 ERROR_CHECK (TcgAddEndName (CreateStruct));\r
554 ERROR_CHECK (TcgEndParameters (CreateStruct));\r
555 ERROR_CHECK (TcgEndMethodCall (CreateStruct));\r
085dcf01
ED
556 return TcgResultSuccess;\r
557}\r
558\r
559/**\r
560 Creates ComPacket with a Method call that sets the PIN column for the row specified.\r
561 This assumes a start session has already been opened with the desired SP.\r
562\r
563 @param [in/out] CreateStruct Structure used to add method call.\r
564 @param [in/out] Size Describes the size of the entire ComPacket (header and payload). Filled out by function.\r
565 @param [in] ComId ComID for the ComPacket\r
566 @param [in] ComIdExtension Extended ComID for the ComPacket\r
567 @param [in] TperSession Tper Session ID for the Packet\r
568 @param [in] HostSession Host Session ID for the Packet\r
569 @param [in] SidRow UID of row of current SP to set PIN column\r
570 @param [in] Password value of PIN to set\r
571 @param [in] PasswordSize Size of PIN\r
572\r
573**/\r
574TCG_RESULT\r
575EFIAPI\r
c411b485
MK
576TcgCreateSetCPin (\r
577 TCG_CREATE_STRUCT *CreateStruct,\r
578 UINT32 *Size,\r
579 UINT16 ComId,\r
580 UINT16 ComIdExtension,\r
581 UINT32 TperSession,\r
582 UINT32 HostSession,\r
583 TCG_UID SidRow,\r
584 const VOID *Password,\r
585 UINT32 PasswordSize\r
085dcf01
ED
586 )\r
587{\r
588 // set new SID Password\r
c411b485
MK
589 ERROR_CHECK (TcgStartComPacket (CreateStruct, ComId, ComIdExtension));\r
590 ERROR_CHECK (TcgStartPacket (CreateStruct, TperSession, HostSession, 0x0, 0x0, 0x0));\r
591 ERROR_CHECK (TcgStartSubPacket (CreateStruct, 0x0));\r
592 ERROR_CHECK (TcgStartMethodSet (CreateStruct, SidRow, 0x03)); // "PIN"\r
593 ERROR_CHECK (TcgAddByteSequence (CreateStruct, Password, PasswordSize, FALSE));\r
594 ERROR_CHECK (TcgEndMethodSet (CreateStruct));\r
595 ERROR_CHECK (TcgEndSubPacket (CreateStruct));\r
596 ERROR_CHECK (TcgEndPacket (CreateStruct));\r
597 ERROR_CHECK (TcgEndComPacket (CreateStruct, Size));\r
085dcf01
ED
598 return TcgResultSuccess;\r
599}\r
600\r
601/**\r
602 Creates ComPacket with a Method call that sets the "Enabled" column for the row specified using the value specified.\r
603 This assumes a start session has already been opened with the desired SP.\r
604\r
605 @param [in/out] CreateStruct Structure used to add method call\r
606 @param [in/out] Size Describes the size of the entire ComPacket (header and payload). Filled out by function.\r
607 @param [in] ComId ComID for the ComPacket\r
608 @param [in] ComIdExtension Extended ComID for the ComPacket\r
609 @param [in] TperSession Tper Session ID for the Packet\r
610 @param [in] HostSession Host Session ID for the Packet\r
611 @param [in] AuthorityUid Authority UID to modify the "Enabled" column for\r
612 @param [in] Enabled Value to set the "Enabled" column to\r
613\r
614**/\r
615TCG_RESULT\r
616EFIAPI\r
c411b485
MK
617TcgSetAuthorityEnabled (\r
618 TCG_CREATE_STRUCT *CreateStruct,\r
619 UINT32 *Size,\r
620 UINT16 ComId,\r
621 UINT16 ComIdExtension,\r
622 UINT32 TperSession,\r
623 UINT32 HostSession,\r
624 TCG_UID AuthorityUid,\r
625 BOOLEAN Enabled\r
085dcf01
ED
626 )\r
627{\r
c411b485
MK
628 ERROR_CHECK (TcgStartComPacket (CreateStruct, ComId, ComIdExtension));\r
629 ERROR_CHECK (TcgStartPacket (CreateStruct, TperSession, HostSession, 0x0, 0x0, 0x0));\r
630 ERROR_CHECK (TcgStartSubPacket (CreateStruct, 0x0));\r
631 ERROR_CHECK (TcgStartMethodSet (CreateStruct, AuthorityUid, 0x05)); // "Enabled"\r
632 ERROR_CHECK (TcgAddBOOLEAN (CreateStruct, Enabled));\r
633 ERROR_CHECK (TcgEndMethodSet (CreateStruct));\r
634 ERROR_CHECK (TcgEndSubPacket (CreateStruct));\r
635 ERROR_CHECK (TcgEndPacket (CreateStruct));\r
636 ERROR_CHECK (TcgEndComPacket (CreateStruct, Size));\r
085dcf01
ED
637 return TcgResultSuccess;\r
638}\r
639\r
640/**\r
641 Create set ace.\r
642\r
643 @param CreateStruct Input create structure.\r
644 @param Size size info.\r
645 @param ComId ComId info.\r
646 @param ComIdExtension ComId extension info.\r
647 @param TperSession Tper session data.\r
648 @param HostSession Host session data.\r
649 @param AceRow Ace row info.\r
650 @param Authority1 Authority 1 info.\r
dd40a1f8 651 @param LogicalOperator Logical operator info.\r
085dcf01
ED
652 @param Authority2 Authority 2 info.\r
653\r
654 @retval Return the action result.\r
655\r
656**/\r
657TCG_RESULT\r
658EFIAPI\r
c411b485
MK
659TcgCreateSetAce (\r
660 TCG_CREATE_STRUCT *CreateStruct,\r
661 UINT32 *Size,\r
662 UINT16 ComId,\r
663 UINT16 ComIdExtension,\r
664 UINT32 TperSession,\r
665 UINT32 HostSession,\r
666 TCG_UID AceRow,\r
667 TCG_UID Authority1,\r
668 BOOLEAN LogicalOperator,\r
669 TCG_UID Authority2\r
085dcf01
ED
670 )\r
671{\r
c411b485
MK
672 UINT8 HalfUidAuthorityObjectRef[4];\r
673 UINT8 HalfUidBooleanAce[4];\r
085dcf01
ED
674\r
675 HalfUidAuthorityObjectRef[0] = 0x0;\r
676 HalfUidAuthorityObjectRef[1] = 0x0;\r
677 HalfUidAuthorityObjectRef[2] = 0xC;\r
678 HalfUidAuthorityObjectRef[3] = 0x5;\r
679\r
680 HalfUidBooleanAce[0] = 0x0;\r
681 HalfUidBooleanAce[1] = 0x0;\r
682 HalfUidBooleanAce[2] = 0x4;\r
683 HalfUidBooleanAce[3] = 0xE;\r
684\r
c411b485
MK
685 ERROR_CHECK (TcgStartComPacket (CreateStruct, ComId, ComIdExtension));\r
686 ERROR_CHECK (TcgStartPacket (CreateStruct, TperSession, HostSession, 0x0, 0x0, 0x0));\r
687 ERROR_CHECK (TcgStartSubPacket (CreateStruct, 0x0));\r
688 ERROR_CHECK (TcgStartMethodSet (CreateStruct, AceRow, 0x03)); // "BooleanExpr"\r
689 ERROR_CHECK (TcgAddStartList (CreateStruct));\r
690 ERROR_CHECK (TcgAddStartName (CreateStruct));\r
691 ERROR_CHECK (TcgAddByteSequence (CreateStruct, HalfUidAuthorityObjectRef, sizeof (HalfUidAuthorityObjectRef), FALSE));\r
692 ERROR_CHECK (TcgAddTcgUid (CreateStruct, Authority1));\r
693 ERROR_CHECK (TcgAddEndName (CreateStruct));\r
694 ERROR_CHECK (TcgAddStartName (CreateStruct));\r
695 ERROR_CHECK (TcgAddByteSequence (CreateStruct, HalfUidAuthorityObjectRef, sizeof (HalfUidAuthorityObjectRef), FALSE));\r
696 ERROR_CHECK (TcgAddTcgUid (CreateStruct, Authority2));\r
697 ERROR_CHECK (TcgAddEndName (CreateStruct));\r
698\r
699 ERROR_CHECK (TcgAddStartName (CreateStruct));\r
700 ERROR_CHECK (TcgAddByteSequence (CreateStruct, HalfUidBooleanAce, sizeof (HalfUidBooleanAce), FALSE));\r
701 ERROR_CHECK (TcgAddBOOLEAN (CreateStruct, LogicalOperator));\r
702 ERROR_CHECK (TcgAddEndName (CreateStruct));\r
703 ERROR_CHECK (TcgAddEndList (CreateStruct));\r
704 ERROR_CHECK (TcgEndMethodSet (CreateStruct));\r
705 ERROR_CHECK (TcgEndSubPacket (CreateStruct));\r
706 ERROR_CHECK (TcgEndPacket (CreateStruct));\r
707 ERROR_CHECK (TcgEndComPacket (CreateStruct, Size));\r
085dcf01
ED
708 return TcgResultSuccess;\r
709}\r
710\r
711/**\r
712 Enum level 0 discovery.\r
713\r
714 @param DiscoveryHeader Discovery header.\r
715 @param Callback Callback function.\r
716 @param Context The context for the function.\r
717\r
718 @retval return true if the callback return TRUE, else return FALSE.\r
719\r
720**/\r
721BOOLEAN\r
722EFIAPI\r
c411b485 723TcgEnumLevel0Discovery (\r
085dcf01
ED
724 const TCG_LEVEL0_DISCOVERY_HEADER *DiscoveryHeader,\r
725 TCG_LEVEL0_ENUM_CALLBACK Callback,\r
726 VOID *Context\r
727 )\r
728{\r
c411b485
MK
729 UINT32 BytesLeft;\r
730 const UINT8 *DiscoveryBufferPtr;\r
731 UINT32 FeatLength;\r
732 TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER *Feat;\r
085dcf01
ED
733\r
734 //\r
735 // Total bytes including descriptors but not including the Length field\r
736 //\r
c411b485 737 BytesLeft = SwapBytes32 (DiscoveryHeader->LengthBE);\r
085dcf01
ED
738\r
739 //\r
740 // If discovery Header is not valid, exit\r
741 //\r
742 if (BytesLeft == 0) {\r
743 return FALSE;\r
744 }\r
745\r
746 //\r
747 // Subtract the Length of the Header, except the Length field, which is not included\r
748 //\r
c411b485 749 BytesLeft -= (sizeof (TCG_LEVEL0_DISCOVERY_HEADER) - sizeof (DiscoveryHeader->LengthBE));\r
085dcf01
ED
750\r
751 //\r
752 // Move ptr to first descriptor\r
753 //\r
c411b485 754 DiscoveryBufferPtr = (const UINT8 *)DiscoveryHeader + sizeof (TCG_LEVEL0_DISCOVERY_HEADER);\r
085dcf01 755\r
c411b485 756 while (BytesLeft > sizeof (TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER)) {\r
085dcf01
ED
757 //\r
758 // Pointer to beginning of descriptor (including common Header)\r
759 //\r
c411b485 760 Feat = (TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER *)DiscoveryBufferPtr;\r
085dcf01 761\r
c411b485 762 FeatLength = Feat->Length + sizeof (TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER);\r
085dcf01
ED
763\r
764 //\r
765 // Not enough bytes left for Feature descriptor\r
766 //\r
767 if (BytesLeft < FeatLength) {\r
768 break;\r
769 }\r
770\r
771 //\r
772 // Report the Feature to the callback\r
773 //\r
c411b485 774 if (Callback (DiscoveryHeader, Feat, FeatLength, Context)) {\r
085dcf01
ED
775 return TRUE;\r
776 }\r
777\r
778 //\r
779 // Descriptor Length only describes Data after common Header\r
780 //\r
c411b485 781 BytesLeft -= FeatLength;\r
085dcf01
ED
782 DiscoveryBufferPtr += FeatLength;\r
783 }\r
784\r
785 return FALSE;\r
786}\r
787\r
788/**\r
789 The callback function for Get Feature function.\r
790\r
791 @param DiscoveryHeader Input discovery header.\r
792 @param Feature Input Feature.\r
793 @param FeatureSize Input Feature size.\r
794 @param Context The context.\r
795\r
796**/\r
797BOOLEAN\r
798EFIAPI\r
c411b485
MK
799TcgFindFeatureCallback (\r
800 const TCG_LEVEL0_DISCOVERY_HEADER *DiscoveryHeader,\r
801 TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER *Feature,\r
802 UINTN FeatureSize,\r
803 VOID *Context\r
085dcf01
ED
804 )\r
805{\r
c411b485 806 TCG_FIND_FEATURE_CTX *FindCtx;\r
085dcf01 807\r
c411b485
MK
808 FindCtx = (TCG_FIND_FEATURE_CTX *)Context;\r
809 if ( SwapBytes16 (Feature->FeatureCode_BE) == FindCtx->FeatureCode ) {\r
810 FindCtx->Feature = Feature;\r
085dcf01
ED
811 FindCtx->FeatureSize = FeatureSize;\r
812 return TRUE; // done enumerating features\r
813 }\r
c411b485 814\r
085dcf01
ED
815 return FALSE; // continue enumerating\r
816}\r
817\r
818/**\r
819 Get Feature code from the header.\r
820\r
821 @param DiscoveryHeader The discovery header.\r
d6b926e7 822 @param FeatureCode return the Feature code.\r
085dcf01
ED
823 @param FeatureSize return the Feature size.\r
824\r
825 @retval return the Feature code data.\r
826**/\r
c411b485 827TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER *\r
085dcf01 828EFIAPI\r
c411b485 829TcgGetFeature (\r
085dcf01
ED
830 const TCG_LEVEL0_DISCOVERY_HEADER *DiscoveryHeader,\r
831 UINT16 FeatureCode,\r
832 UINTN *FeatureSize\r
833 )\r
834{\r
c411b485 835 TCG_FIND_FEATURE_CTX FindCtx;\r
085dcf01
ED
836\r
837 FindCtx.FeatureCode = FeatureCode;\r
c411b485 838 FindCtx.Feature = NULL;\r
085dcf01
ED
839 FindCtx.FeatureSize = 0;\r
840\r
c411b485 841 TcgEnumLevel0Discovery (DiscoveryHeader, TcgFindFeatureCallback, &FindCtx);\r
085dcf01
ED
842 if (FeatureSize != NULL) {\r
843 *FeatureSize = FindCtx.FeatureSize;\r
844 }\r
c411b485 845\r
085dcf01
ED
846 return FindCtx.Feature;\r
847}\r
848\r
849/**\r
850 Determines if the protocol provided is part of the provided supported protocol list.\r
851\r
852 @param[in] ProtocolList Supported protocol list to investigate\r
853 @param[in] Protocol Protocol value to determine if supported\r
854\r
855 @return TRUE = protocol is supported, FALSE = protocol is not supported\r
856**/\r
857BOOLEAN\r
858EFIAPI\r
c411b485
MK
859TcgIsProtocolSupported (\r
860 const TCG_SUPPORTED_SECURITY_PROTOCOLS *ProtocolList,\r
861 UINT16 Protocol\r
085dcf01
ED
862 )\r
863{\r
c411b485
MK
864 UINT16 Index;\r
865 UINT16 ListLength;\r
085dcf01 866\r
c411b485 867 ListLength = SwapBytes16 (ProtocolList->ListLength_BE);\r
085dcf01 868\r
c411b485 869 if (ListLength > sizeof (ProtocolList->List)) {\r
085dcf01 870 DEBUG ((DEBUG_INFO, "WARNING: list Length is larger than max allowed Value; truncating\n"));\r
c411b485 871 ListLength = sizeof (ProtocolList->List);\r
085dcf01
ED
872 }\r
873\r
874 for (Index = 0; Index < ListLength; Index++) {\r
875 if (ProtocolList->List[Index] == Protocol) {\r
876 return TRUE;\r
877 }\r
878 }\r
879\r
880 return FALSE;\r
881}\r
882\r
883/**\r
884 Check whether lock or not.\r
885\r
886 @param Discovery\r
887\r
0ab475c9 888 @retval TRUE if lock, FALSE if not lock.\r
085dcf01
ED
889**/\r
890BOOLEAN\r
891EFIAPI\r
c411b485
MK
892TcgIsLocked (\r
893 const TCG_LEVEL0_DISCOVERY_HEADER *Discovery\r
085dcf01
ED
894 )\r
895{\r
c411b485
MK
896 UINTN Size;\r
897 TCG_LOCKING_FEATURE_DESCRIPTOR *LockDescriptor;\r
085dcf01 898\r
c411b485
MK
899 Size = 0;\r
900 LockDescriptor = (TCG_LOCKING_FEATURE_DESCRIPTOR *)TcgGetFeature (Discovery, TCG_FEATURE_LOCKING, &Size);\r
085dcf01 901\r
c411b485 902 if ((LockDescriptor != NULL) && (Size >= sizeof (*LockDescriptor))) {\r
085dcf01
ED
903 DEBUG ((DEBUG_INFO, "locked: %d\n", LockDescriptor->Locked));\r
904 return LockDescriptor->Locked;\r
905 }\r
906\r
907 //\r
908 // Descriptor was not found\r
909 //\r
910 return FALSE;\r
911}\r