]>
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 | |
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 | |
29 | CHAR8*\r | |
30 | EFIAPI\r | |
31 | TcgMethodStatusString(\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 | |
70 | TCG_RESULT\r | |
71 | EFIAPI\r | |
72 | TcgStartMethodCall(\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 | |
101 | TCG_RESULT\r | |
102 | EFIAPI\r | |
103 | TcgStartParameters(\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 | |
126 | TCG_RESULT\r | |
127 | EFIAPI\r | |
128 | TcgEndParameters(\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 | |
151 | TCG_RESULT\r | |
152 | EFIAPI\r | |
153 | TcgEndMethodCall(\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 | |
187 | TCG_RESULT\r | |
188 | EFIAPI\r | |
189 | TcgGetComIds(\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 | |
218 | TCG_RESULT\r | |
219 | EFIAPI\r | |
220 | TcgCheckComIds(\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 | |
246 | TCG_RESULT\r | |
247 | EFIAPI\r | |
248 | TcgGetMethodStatus(\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 | |
306 | CHAR8*\r | |
307 | EFIAPI\r | |
308 | TcgTokenTypeString(\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 | |
350 | TCG_RESULT\r | |
351 | EFIAPI\r | |
352 | TcgCreateStartSession(\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 | |
409 | TCG_RESULT\r | |
410 | EFIAPI\r | |
411 | TcgParseSyncSession(\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 | |
483 | TCG_RESULT\r | |
484 | EFIAPI\r | |
485 | TcgCreateEndSession(\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 | |
513 | TCG_RESULT\r | |
514 | EFIAPI\r | |
515 | TcgStartMethodSet(\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 | |
537 | TCG_RESULT\r | |
538 | EFIAPI\r | |
539 | TcgEndMethodSet(\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 | |
566 | TCG_RESULT\r | |
567 | EFIAPI\r | |
568 | TcgCreateSetCPin(\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 | |
607 | TCG_RESULT\r | |
608 | EFIAPI\r | |
609 | TcgSetAuthorityEnabled(\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 | |
649 | TCG_RESULT\r | |
650 | EFIAPI\r | |
651 | TcgCreateSetAce(\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 | |
713 | BOOLEAN\r | |
714 | EFIAPI\r | |
715 | TcgEnumLevel0Discovery(\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 | |
789 | BOOLEAN\r | |
790 | EFIAPI\r | |
791 | TcgFindFeatureCallback(\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 | |
818 | TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER*\r | |
819 | EFIAPI\r | |
820 | TcgGetFeature(\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 | |
847 | BOOLEAN\r | |
848 | EFIAPI\r | |
849 | TcgIsProtocolSupported(\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 |
880 | BOOLEAN\r | |
881 | EFIAPI\r | |
882 | TcgIsLocked(\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 |