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