]>
Commit | Line | Data |
---|---|---|
085dcf01 ED |
1 | /** @file\r |
2 | Provide functions to provide tcg storage core spec related functions.\r | |
3 | \r | |
4 | Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r | |
289b714b | 5 | SPDX-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 | |
15 | typedef 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 | 29 | CHAR8 *\r |
085dcf01 | 30 | EFIAPI\r |
c411b485 MK |
31 | TcgMethodStatusString (\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 | |
70 | TCG_RESULT\r | |
71 | EFIAPI\r | |
c411b485 MK |
72 | TcgStartMethodCall (\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 | |
102 | TCG_RESULT\r | |
103 | EFIAPI\r | |
c411b485 MK |
104 | TcgStartParameters (\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 | |
128 | TCG_RESULT\r | |
129 | EFIAPI\r | |
c411b485 MK |
130 | TcgEndParameters (\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 | |
154 | TCG_RESULT\r | |
155 | EFIAPI\r | |
c411b485 MK |
156 | TcgEndMethodCall (\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 | |
191 | TCG_RESULT\r | |
192 | EFIAPI\r | |
c411b485 MK |
193 | TcgGetComIds (\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 | |
222 | TCG_RESULT\r | |
223 | EFIAPI\r | |
c411b485 MK |
224 | TcgCheckComIds (\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 | |
251 | TCG_RESULT\r | |
252 | EFIAPI\r | |
c411b485 MK |
253 | TcgGetMethodStatus (\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 | 312 | CHAR8 *\r |
085dcf01 | 313 | EFIAPI\r |
c411b485 | 314 | TcgTokenTypeString (\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 | |
356 | TCG_RESULT\r | |
357 | EFIAPI\r | |
c411b485 MK |
358 | TcgCreateStartSession (\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 | |
416 | TCG_RESULT\r | |
417 | EFIAPI\r | |
c411b485 | 418 | TcgParseSyncSession (\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 | |
491 | TCG_RESULT\r | |
492 | EFIAPI\r | |
c411b485 MK |
493 | TcgCreateEndSession (\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 | |
521 | TCG_RESULT\r | |
522 | EFIAPI\r | |
c411b485 MK |
523 | TcgStartMethodSet (\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 | |
545 | TCG_RESULT\r | |
546 | EFIAPI\r | |
c411b485 MK |
547 | TcgEndMethodSet (\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 | |
574 | TCG_RESULT\r | |
575 | EFIAPI\r | |
c411b485 MK |
576 | TcgCreateSetCPin (\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 | |
615 | TCG_RESULT\r | |
616 | EFIAPI\r | |
c411b485 MK |
617 | TcgSetAuthorityEnabled (\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 | |
657 | TCG_RESULT\r | |
658 | EFIAPI\r | |
c411b485 MK |
659 | TcgCreateSetAce (\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 | |
721 | BOOLEAN\r | |
722 | EFIAPI\r | |
c411b485 | 723 | TcgEnumLevel0Discovery (\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 | |
797 | BOOLEAN\r | |
798 | EFIAPI\r | |
c411b485 MK |
799 | TcgFindFeatureCallback (\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 | 827 | TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER *\r |
085dcf01 | 828 | EFIAPI\r |
c411b485 | 829 | TcgGetFeature (\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 | |
857 | BOOLEAN\r | |
858 | EFIAPI\r | |
c411b485 MK |
859 | TcgIsProtocolSupported (\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 |
890 | BOOLEAN\r | |
891 | EFIAPI\r | |
c411b485 MK |
892 | TcgIsLocked (\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 |