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