2 Provide functions to provide tcg storage core spec related functions.
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include <Library/TcgStorageCoreLib.h>
17 #include <Library/BaseLib.h>
18 #include <Library/BaseMemoryLib.h>
19 #include <Library/DebugLib.h>
20 //#include <Library/PrintLib.h>
23 Required to be called before calling any other Tcg functions with the TCG_CREATE_STRUCT.
24 Initializes the packet variables to NULL. Additionally, the buffer will be memset.
26 @param [in/out] CreateStruct Structure to initialize
27 @param [in] Buffer Buffer allocated by client of library. It will contain the Tcg encoded packet. This cannot be null.
28 @param [in] BufferSize Size of buffer provided. It cannot be 0.
30 @retval Return the action result.
34 TcgInitTcgCreateStruct(
35 TCG_CREATE_STRUCT
*CreateStruct
,
40 NULL_CHECK(CreateStruct
);
43 if (BufferSize
== 0) {
44 DEBUG ((DEBUG_INFO
, "BufferSize=0\n"));
45 return (TcgResultFailureZeroSize
);
48 ZeroMem(Buffer
, BufferSize
);
49 CreateStruct
->BufferSize
= BufferSize
;
50 CreateStruct
->Buffer
= Buffer
;
51 CreateStruct
->ComPacket
= NULL
;
52 CreateStruct
->CurPacket
= NULL
;
53 CreateStruct
->CurSubPacket
= NULL
;
55 return (TcgResultSuccess
);
60 Encodes the ComPacket header to the data structure.
62 @param[in/out] CreateStruct Structure to initialize
63 @param[in] ComId ComID of the Tcg ComPacket.
64 @param[in] ComIdExtension ComID Extension of the Tcg ComPacket.
70 TCG_CREATE_STRUCT
*CreateStruct
,
75 NULL_CHECK(CreateStruct
);
77 if (CreateStruct
->ComPacket
!= NULL
||
78 CreateStruct
->CurPacket
!= NULL
||
79 CreateStruct
->CurSubPacket
!= NULL
81 DEBUG ((DEBUG_INFO
, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct
->ComPacket
, CreateStruct
->CurPacket
,
82 CreateStruct
->CurSubPacket
));
83 return (TcgResultFailureInvalidAction
);
86 if (sizeof(TCG_COM_PACKET
) > CreateStruct
->BufferSize
) {
87 DEBUG ((DEBUG_INFO
, "BufferSize=0x%X\n", CreateStruct
->BufferSize
));
88 return (TcgResultFailureBufferTooSmall
);
91 CreateStruct
->ComPacket
= (TCG_COM_PACKET
*)CreateStruct
->Buffer
;
92 CreateStruct
->ComPacket
->ComIDBE
= SwapBytes16(ComId
);
93 CreateStruct
->ComPacket
->ComIDExtensionBE
= SwapBytes16(ComIdExtension
);
95 return (TcgResultSuccess
);
100 Starts a new ComPacket in the Data structure.
102 @param [in/out] CreateStruct Structure used to add Tcg Packet
103 @param[in] Tsn Packet Tper session number
104 @param[in] Hsn Packet Host session number
105 @param[in] SeqNumber Packet Sequence Number
106 @param[in] AckType Packet Acknowledge Type
107 @param[in] Ack Packet Acknowledge
113 TCG_CREATE_STRUCT
*CreateStruct
,
122 NULL_CHECK(CreateStruct
);
126 if (CreateStruct
->ComPacket
== NULL
||
127 CreateStruct
->CurPacket
!= NULL
||
128 CreateStruct
->CurSubPacket
!= NULL
130 DEBUG ((DEBUG_INFO
, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct
->ComPacket
, CreateStruct
->CurPacket
, CreateStruct
->CurSubPacket
));
131 return (TcgResultFailureInvalidAction
);
134 // update TCG_COM_PACKET and packet lengths
135 AddedSize
= sizeof(TCG_PACKET
);
137 if ((SwapBytes32(CreateStruct
->ComPacket
->LengthBE
) + AddedSize
) > CreateStruct
->BufferSize
) {
138 DEBUG ((DEBUG_INFO
, "BufferSize=0x%X\n", CreateStruct
->BufferSize
));
139 return (TcgResultFailureBufferTooSmall
);
142 CreateStruct
->CurPacket
= (TCG_PACKET
*)(CreateStruct
->ComPacket
->Payload
+ SwapBytes32(CreateStruct
->ComPacket
->LengthBE
));
144 CreateStruct
->CurPacket
->TperSessionNumberBE
= SwapBytes32( Tsn
);
145 CreateStruct
->CurPacket
->HostSessionNumberBE
= SwapBytes32( Hsn
);
146 CreateStruct
->CurPacket
->SequenceNumberBE
= SwapBytes32( SeqNumber
);
147 CreateStruct
->CurPacket
->AckTypeBE
= SwapBytes16( AckType
);
148 CreateStruct
->CurPacket
->AcknowledgementBE
= SwapBytes32( Ack
);
150 CreateStruct
->CurPacket
->LengthBE
= 0;
152 // update TCG_COM_PACKET Length for next pointer
153 CreateStruct
->ComPacket
->LengthBE
= SwapBytes32( SwapBytes32(CreateStruct
->ComPacket
->LengthBE
) + AddedSize
);
155 return (TcgResultSuccess
);
160 Starts a new SubPacket in the Data structure.
162 @param[in/out] CreateStruct Structure used to start Tcg SubPacket
163 @param[in] Kind SubPacket kind
169 TCG_CREATE_STRUCT
*CreateStruct
,
175 NULL_CHECK(CreateStruct
);
179 if (CreateStruct
->ComPacket
== NULL
||
180 CreateStruct
->CurPacket
== NULL
||
181 CreateStruct
->CurSubPacket
!= NULL
183 DEBUG ((DEBUG_INFO
, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct
->ComPacket
, CreateStruct
->CurPacket
, CreateStruct
->CurSubPacket
));
184 return (TcgResultFailureInvalidAction
);
187 AddedSize
= sizeof(TCG_SUB_PACKET
);
189 if ((SwapBytes32(CreateStruct
->ComPacket
->LengthBE
) + AddedSize
) > CreateStruct
->BufferSize
) {
190 DEBUG ((DEBUG_INFO
, "BufferSize=0x%X\n", CreateStruct
->BufferSize
));
191 return (TcgResultFailureBufferTooSmall
);
194 CreateStruct
->CurSubPacket
= (TCG_SUB_PACKET
*)(CreateStruct
->CurPacket
->Payload
+ SwapBytes32(CreateStruct
->CurPacket
->LengthBE
));
195 CreateStruct
->CurSubPacket
->KindBE
= SwapBytes16(Kind
);
198 CreateStruct
->CurSubPacket
->LengthBE
= 0;
200 // update TCG_COM_PACKET and packet lengths
201 CreateStruct
->ComPacket
->LengthBE
= SwapBytes32(SwapBytes32(CreateStruct
->ComPacket
->LengthBE
) + AddedSize
);
202 CreateStruct
->CurPacket
->LengthBE
= SwapBytes32(SwapBytes32(CreateStruct
->CurPacket
->LengthBE
) + AddedSize
);
204 return (TcgResultSuccess
);
209 Ends the current SubPacket in the Data structure. This function will also perform the 4-byte padding
210 required for Subpackets.
212 @param[in/out] CreateStruct Structure used to end the current Tcg SubPacket
218 TCG_CREATE_STRUCT
*CreateStruct
223 NULL_CHECK(CreateStruct
);
227 if (CreateStruct
->ComPacket
== NULL
||
228 CreateStruct
->CurPacket
== NULL
||
229 CreateStruct
->CurSubPacket
== NULL
231 DEBUG ((DEBUG_INFO
, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct
->ComPacket
, CreateStruct
->CurPacket
, CreateStruct
->CurSubPacket
));
232 return (TcgResultFailureInvalidAction
);
235 // align to 4-byte boundaries, so shift padding
236 // pad Size does not apply to subpacket Length
237 PadSize
= TCG_SUBPACKET_ALIGNMENT
- (SwapBytes32(CreateStruct
->CurSubPacket
->LengthBE
) & (TCG_SUBPACKET_ALIGNMENT
- 1));
239 if (PadSize
== TCG_SUBPACKET_ALIGNMENT
) {
243 if ((SwapBytes32(CreateStruct
->ComPacket
->LengthBE
) + PadSize
) > CreateStruct
->BufferSize
) {
244 DEBUG ((DEBUG_INFO
, "BufferSize=0x%X\n", CreateStruct
->BufferSize
));
245 return (TcgResultFailureBufferTooSmall
);
248 CreateStruct
->CurPacket
->LengthBE
= SwapBytes32(SwapBytes32(CreateStruct
->CurPacket
->LengthBE
) + PadSize
);
249 CreateStruct
->ComPacket
->LengthBE
= SwapBytes32(SwapBytes32(CreateStruct
->ComPacket
->LengthBE
) + PadSize
);
251 CreateStruct
->CurSubPacket
= NULL
;
253 return (TcgResultSuccess
);
258 Ends the current Packet in the Data structure.
260 @param[in/out] CreateStruct Structure used to end the current Tcg Packet
266 TCG_CREATE_STRUCT
*CreateStruct
269 NULL_CHECK(CreateStruct
);
271 if (CreateStruct
->ComPacket
== NULL
||
272 CreateStruct
->CurPacket
== NULL
||
273 CreateStruct
->CurSubPacket
!= NULL
275 DEBUG ((DEBUG_INFO
, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct
->ComPacket
, CreateStruct
->CurPacket
, CreateStruct
->CurSubPacket
));
276 return (TcgResultFailureInvalidAction
);
279 CreateStruct
->CurPacket
= NULL
;
281 return (TcgResultSuccess
);
286 Ends the ComPacket in the Data structure and ret
288 @param [in/out] CreateStruct Structure used to end the Tcg ComPacket
289 @param [in/out] Size Describes the Size of the entire ComPacket (Header and payload). Filled out by function.
295 TCG_CREATE_STRUCT
*CreateStruct
,
299 NULL_CHECK(CreateStruct
);
302 if (CreateStruct
->ComPacket
== NULL
||
303 CreateStruct
->CurPacket
!= NULL
||
304 CreateStruct
->CurSubPacket
!= NULL
306 DEBUG ((DEBUG_INFO
, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct
->ComPacket
, CreateStruct
->CurPacket
, CreateStruct
->CurSubPacket
));
307 return (TcgResultFailureInvalidAction
);
310 *Size
= SwapBytes32(CreateStruct
->ComPacket
->LengthBE
) + sizeof(*CreateStruct
->ComPacket
);
311 CreateStruct
->ComPacket
= NULL
;
313 return (TcgResultSuccess
);
317 Adds raw Data with optional Header
319 @param CreateStruct The create structure.
320 @param Header The header structure.
321 @param HeaderSize The header size.
322 @param Data The data need to add.
323 @param DataSize The data size.
324 @param ByteSwapData Whether byte or swap data.
329 TCG_CREATE_STRUCT
*CreateStruct
,
339 const UINT8
* DataBytes
;
346 NULL_CHECK(CreateStruct
);
348 if ((HeaderSize
!= 0 && Header
== NULL
) ||
349 (DataSize
!= 0 && Data
== NULL
)
351 DEBUG ((DEBUG_INFO
, "HeaderSize=0x%X Header=%p DataSize=0x%X Data=%p\n", HeaderSize
, Header
, DataSize
, Data
));
352 return (TcgResultFailureNullPointer
);
355 if (CreateStruct
->ComPacket
== NULL
||
356 CreateStruct
->CurPacket
== NULL
||
357 CreateStruct
->CurSubPacket
== NULL
359 DEBUG ((DEBUG_INFO
, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct
->ComPacket
, CreateStruct
->CurPacket
, CreateStruct
->CurSubPacket
));
360 return (TcgResultFailureInvalidAction
);
363 // verify there is enough Buffer Size
364 AddedSize
= HeaderSize
+ DataSize
;
365 if ((SwapBytes32(CreateStruct
->ComPacket
->LengthBE
) + AddedSize
) > CreateStruct
->BufferSize
) {
366 return (TcgResultFailureBufferTooSmall
);
369 // Get a pointer to where the new bytes should go
370 Dest
= CreateStruct
->ComPacket
->Payload
+ SwapBytes32(CreateStruct
->ComPacket
->LengthBE
);
372 switch (HeaderSize
) {
373 case sizeof(TCG_SIMPLE_TOKEN_SHORT_ATOM
):
374 case sizeof(TCG_SIMPLE_TOKEN_MEDIUM_ATOM
):
375 case sizeof(TCG_SIMPLE_TOKEN_LONG_ATOM
):
376 CopyMem(Dest
, Header
, HeaderSize
);
378 case 0: // no Header is valid
380 // invalid Header Size
382 DEBUG ((DEBUG_INFO
, "unsupported HeaderSize=%u\n", HeaderSize
));
383 return TcgResultFailure
;
386 // copy the Data bytes
388 DataBytes
= (const UINT8
*)Data
;
389 for (Index
= 0; Index
< DataSize
; Index
++) {
390 Dest
[Index
] = DataBytes
[DataSize
- 1 - Index
];
393 CopyMem(Dest
, Data
, DataSize
);
396 // Update all the packet sizes
397 CreateStruct
->ComPacket
->LengthBE
= SwapBytes32(SwapBytes32(CreateStruct
->ComPacket
->LengthBE
) + AddedSize
);
398 CreateStruct
->CurPacket
->LengthBE
= SwapBytes32(SwapBytes32(CreateStruct
->CurPacket
->LengthBE
) + AddedSize
);
399 CreateStruct
->CurSubPacket
->LengthBE
= SwapBytes32(SwapBytes32(CreateStruct
->CurSubPacket
->LengthBE
) + AddedSize
);
401 return (TcgResultSuccess
);
406 Adds a single raw token byte to the Data structure.
408 @param[in/out] CreateStruct Structure used to add the byte
409 @param[in] Byte Byte to add
415 TCG_CREATE_STRUCT
*CreateStruct
,
419 return TcgAddRawTokenData(CreateStruct
, NULL
, 0, &Byte
, 1, FALSE
);
424 simple tokens - atoms: tiny, short, medium, long and empty atoms.
425 tiny atom can be a signed or unsigned integer.
426 short, medium, long can be a signed or unsigned integer OR a complete or non-final byte sequence.
428 @param CreateStruct The create structure.
429 @param Data The data need to add.
430 @param DataSize The data size.
431 @param ByteOrInt, Data format is byte or int.
432 @param SignOrCont sign or cont.
438 TCG_CREATE_STRUCT
*CreateStruct
,
445 const UINT8
* DataBytes
;
446 TCG_SIMPLE_TOKEN_TINY_ATOM TinyAtom
;
447 TCG_SIMPLE_TOKEN_SHORT_ATOM ShortAtom
;
448 TCG_SIMPLE_TOKEN_MEDIUM_ATOM MediumAtom
;
449 TCG_SIMPLE_TOKEN_LONG_ATOM LongAtom
;
451 NULL_CHECK(CreateStruct
);
454 if (ByteOrInt
== TCG_ATOM_TYPE_INTEGER
) {
455 DEBUG ((DEBUG_INFO
, "0-Size integer not allowed\n"));
456 return TcgResultFailure
;
459 // if DataSize != 0, Data must be valid
463 // encode Data using the shortest possible atom
464 DataBytes
= (const UINT8
*)Data
;
465 if ((DataSize
== 1) &&
466 (ByteOrInt
== TCG_ATOM_TYPE_INTEGER
) &&
467 ((SignOrCont
!= 0 && ((TCG_TOKEN_TINYATOM_SIGNED_MIN_VALUE
<= *(INT8
*)Data
) && (*(INT8
*)Data
<= TCG_TOKEN_TINYATOM_SIGNED_MAX_VALUE
))) ||
468 (SignOrCont
== 0 && ((*DataBytes
<= TCG_TOKEN_TINYATOM_UNSIGNED_MAX_VALUE
))))
470 TinyAtom
.TinyAtomBits
.IsZero
= 0;
471 TinyAtom
.TinyAtomBits
.Sign
= SignOrCont
;
472 TinyAtom
.TinyAtomBits
.Data
= *DataBytes
& TCG_TOKEN_TINYATOM_UNSIGNED_MAX_VALUE
;
473 return TcgAddRawTokenData(CreateStruct
, NULL
, 0, (UINT8
*)&TinyAtom
, sizeof(TCG_SIMPLE_TOKEN_TINY_ATOM
), FALSE
);
476 if (DataSize
<= TCG_TOKEN_SHORTATOM_MAX_BYTE_SIZE
) {
477 ShortAtom
.ShortAtomBits
.IsOne
= 1;
478 ShortAtom
.ShortAtomBits
.IsZero
= 0;
479 ShortAtom
.ShortAtomBits
.ByteOrInt
= ByteOrInt
;
480 ShortAtom
.ShortAtomBits
.SignOrCont
= SignOrCont
;
481 ShortAtom
.ShortAtomBits
.Length
= DataSize
& 0x0F;
482 return TcgAddRawTokenData(CreateStruct
, &ShortAtom
, sizeof(TCG_SIMPLE_TOKEN_SHORT_ATOM
), Data
, DataSize
, ByteOrInt
== TCG_ATOM_TYPE_INTEGER
);
485 if (DataSize
<= TCG_TOKEN_MEDIUMATOM_MAX_BYTE_SIZE
) {
486 MediumAtom
.MediumAtomBits
.IsOne1
= 1;
487 MediumAtom
.MediumAtomBits
.IsOne2
= 1;
488 MediumAtom
.MediumAtomBits
.IsZero
= 0;
489 MediumAtom
.MediumAtomBits
.ByteOrInt
= ByteOrInt
;
490 MediumAtom
.MediumAtomBits
.SignOrCont
= SignOrCont
;
491 MediumAtom
.MediumAtomBits
.LengthLow
= DataSize
& 0xFF;
492 MediumAtom
.MediumAtomBits
.LengthHigh
= (DataSize
>> TCG_MEDIUM_ATOM_LENGTH_HIGH_SHIFT
) & TCG_MEDIUM_ATOM_LENGTH_HIGH_MASK
;
493 return TcgAddRawTokenData(CreateStruct
, &MediumAtom
, sizeof(TCG_SIMPLE_TOKEN_MEDIUM_ATOM
), Data
, DataSize
, ByteOrInt
== TCG_ATOM_TYPE_INTEGER
);
496 LongAtom
.LongAtomBits
.IsOne1
= 1;
497 LongAtom
.LongAtomBits
.IsOne2
= 1;
498 LongAtom
.LongAtomBits
.IsOne3
= 1;
499 LongAtom
.LongAtomBits
.IsZero
= 0;
500 LongAtom
.LongAtomBits
.ByteOrInt
= ByteOrInt
;
501 LongAtom
.LongAtomBits
.SignOrCont
= SignOrCont
;
502 LongAtom
.LongAtomBits
.LengthLow
= DataSize
& 0xFF;
503 LongAtom
.LongAtomBits
.LengthMid
= (DataSize
>> TCG_LONG_ATOM_LENGTH_MID_SHIFT
) & 0xFF;
504 LongAtom
.LongAtomBits
.LengthHigh
= (DataSize
>> TCG_LONG_ATOM_LENGTH_HIGH_SHIFT
) & 0xFF;
505 return TcgAddRawTokenData(CreateStruct
, &LongAtom
, sizeof(TCG_SIMPLE_TOKEN_LONG_ATOM
), Data
, DataSize
, ByteOrInt
== TCG_ATOM_TYPE_INTEGER
);
510 Adds the Data parameter as a byte sequence to the Data structure.
512 @param[in/out] CreateStruct Structure used to add the byte sequence
513 @param[in] Data Byte sequence that will be encoded and copied into Data structure
514 @param[in] DataSize Length of Data provided
515 @param[in] Continued TRUE if byte sequence is continued or
516 FALSE if the Data contains the entire byte sequence to be encoded
522 TCG_CREATE_STRUCT
*CreateStruct
,
528 return TcgAddAtom(CreateStruct
, Data
, DataSize
, TCG_ATOM_TYPE_BYTE
, Continued
? 1 : 0);
533 Adds an arbitrary-Length integer to the Data structure.
534 The integer will be encoded using the shortest possible atom.
536 @param[in/out] CreateStruct Structure used to add the integer
537 @param[in] Data Integer in host byte order that will be encoded and copied into Data structure
538 @param[in] DataSize Length in bytes of the Data provided
539 @param[in] SignedInteger TRUE if the integer is signed or FALSE if the integer is unsigned
545 TCG_CREATE_STRUCT
*CreateStruct
,
548 BOOLEAN SignedInteger
551 const UINT8
* DataBytes
;
552 UINT32 ActualDataSize
;
553 BOOLEAN ValueIsNegative
;
555 NULL_CHECK(CreateStruct
);
559 DEBUG ((DEBUG_INFO
, "invalid DataSize=0\n"));
560 return TcgResultFailure
;
563 DataBytes
= (const UINT8
*)Data
;
565 // integer should be represented by smallest atom possible
566 // so calculate real Data Size
567 ValueIsNegative
= SignedInteger
&& DataBytes
[ DataSize
- 1 ] & 0x80;
569 // assumes native Data is little endian
570 // shorten Data to smallest byte representation
571 for (ActualDataSize
= DataSize
; ActualDataSize
> 1; ActualDataSize
--) {
572 // ignore sign extended FFs
573 if (ValueIsNegative
&& (DataBytes
[ActualDataSize
- 1] != 0xFF)) {
575 } else if (!ValueIsNegative
&& (DataBytes
[ActualDataSize
- 1] != 0)) {
576 // ignore extended 00s
581 return TcgAddAtom(CreateStruct
, Data
, ActualDataSize
, TCG_ATOM_TYPE_INTEGER
, SignedInteger
? 1 : 0);
585 Adds an 8-bit unsigned integer to the Data structure.
587 @param[in/out] CreateStruct Structure used to add the integer
588 @param[in] Value Integer Value to add
594 TCG_CREATE_STRUCT
*CreateStruct
,
598 return TcgAddInteger(CreateStruct
, &Value
, sizeof(Value
), FALSE
);
603 Adds a 16-bit unsigned integer to the Data structure.
605 @param[in/out] CreateStruct Structure used to add the integer
606 @param[in] Value Integer Value to add
612 TCG_CREATE_STRUCT
*CreateStruct
,
616 return TcgAddInteger(CreateStruct
, &Value
, sizeof(Value
), FALSE
);
621 Adds a 32-bit unsigned integer to the Data structure.
623 @param[in/out] CreateStruct Structure used to add the integer
624 @param[in] Value Integer Value to add
630 TCG_CREATE_STRUCT
*CreateStruct
,
634 return TcgAddInteger(CreateStruct
, &Value
, sizeof(Value
), FALSE
);
640 Adds a 64-bit unsigned integer to the Data structure.
642 @param[in/out] CreateStruct Structure used to add the integer
643 @param[in] Value Integer Value to add
649 TCG_CREATE_STRUCT
*CreateStruct
,
653 return TcgAddInteger(CreateStruct
, &Value
, sizeof(Value
), FALSE
);
657 Adds a BOOLEAN to the Data structure.
659 @param[in/out] CreateStruct Structure used to add the integer
660 @param[in] Value BOOLEAN Value to add
666 TCG_CREATE_STRUCT
*CreateStruct
,
670 return TcgAddInteger(CreateStruct
, &Value
, sizeof(Value
), FALSE
);
676 @param [in/out] CreateStruct Structure used to add the integer
677 @param Uid Input uid info.
679 @retval return the action result.
685 TCG_CREATE_STRUCT
*CreateStruct
,
689 return TcgAddByteSequence(CreateStruct
, &Uid
, sizeof(TCG_UID
), FALSE
);
695 @param [in/out] CreateStruct Structure used to add the integer
697 @retval return the action result.
703 TCG_CREATE_STRUCT
*CreateStruct
706 return TcgAddRawByte(CreateStruct
, TCG_TOKEN_STARTLIST
);
712 @param [in/out] CreateStruct Structure used to add the integer
714 @retval return the action result.
720 TCG_CREATE_STRUCT
*CreateStruct
723 return TcgAddRawByte(CreateStruct
, TCG_TOKEN_ENDLIST
);
729 @param [in/out] CreateStruct Structure used to add the integer
731 @retval return the action result.
737 TCG_CREATE_STRUCT
*CreateStruct
740 return TcgAddRawByte(CreateStruct
, TCG_TOKEN_STARTNAME
);
746 @param [in/out] CreateStruct Structure used to add the integer
748 @retval return the action result.
754 TCG_CREATE_STRUCT
*CreateStruct
757 return TcgAddRawByte(CreateStruct
, TCG_TOKEN_ENDNAME
);
763 @param [in/out] CreateStruct Structure used to add the integer
765 @retval return the action result.
771 TCG_CREATE_STRUCT
*CreateStruct
774 return TcgAddRawByte(CreateStruct
, TCG_TOKEN_CALL
);
780 @param [in/out] CreateStruct Structure used to add the integer
782 @retval return the action result.
788 TCG_CREATE_STRUCT
*CreateStruct
791 return TcgAddRawByte(CreateStruct
, TCG_TOKEN_ENDDATA
);
797 @param [in/out] CreateStruct Structure used to add the integer
799 @retval return the action result.
805 TCG_CREATE_STRUCT
*CreateStruct
808 return TcgAddRawByte(CreateStruct
, TCG_TOKEN_ENDSESSION
);
812 Add start transaction.
814 @param [in/out] CreateStruct Structure used to add the integer
816 @retval return the action result.
821 TcgAddStartTransaction(
822 TCG_CREATE_STRUCT
*CreateStruct
825 return TcgAddRawByte(CreateStruct
, TCG_TOKEN_STARTTRANSACTION
);
831 @param [in/out] CreateStruct Structure used to add the integer
833 @retval return the action result.
838 TcgAddEndTransaction(
839 TCG_CREATE_STRUCT
*CreateStruct
842 return TcgAddRawByte(CreateStruct
, TCG_TOKEN_ENDTRANSACTION
);
846 Initial the tcg parse stucture.
848 @param ParseStruct Input parse structure.
849 @param Buffer Input buffer data.
850 @param BufferSize Input buffer size.
852 @retval return the action result.
857 TcgInitTcgParseStruct(
858 TCG_PARSE_STRUCT
*ParseStruct
,
863 UINT32 ComPacketLength
;
866 NULL_CHECK(ParseStruct
);
869 if (BufferSize
< sizeof(TCG_COM_PACKET
)) {
870 return (TcgResultFailureBufferTooSmall
);
873 ParseStruct
->ComPacket
= (TCG_COM_PACKET
*)Buffer
;
875 ComPacketLength
= SwapBytes32(ParseStruct
->ComPacket
->LengthBE
);
877 if ((BufferSize
- sizeof(TCG_COM_PACKET
)) < ComPacketLength
) {
878 DEBUG ((DEBUG_INFO
, "Buffer %u too small for ComPacket %u\n", BufferSize
, ComPacketLength
));
879 return (TcgResultFailureBufferTooSmall
);
882 ParseStruct
->BufferSize
= BufferSize
;
883 ParseStruct
->Buffer
= Buffer
;
885 ParseStruct
->CurPacket
= NULL
;
886 ParseStruct
->CurSubPacket
= NULL
;
887 ParseStruct
->CurPtr
= NULL
;
889 // if payload > 0, then must have a packet
890 if (ComPacketLength
!= 0) {
891 if (ComPacketLength
< sizeof(TCG_PACKET
)) {
892 DEBUG ((DEBUG_INFO
, "ComPacket too small for Packet\n"));
893 return (TcgResultFailureBufferTooSmall
);
895 ParseStruct
->CurPacket
= (TCG_PACKET
*)ParseStruct
->ComPacket
->Payload
;
897 PacketLength
= SwapBytes32(ParseStruct
->CurPacket
->LengthBE
);
899 if (PacketLength
> 0) {
900 if (PacketLength
< sizeof(TCG_SUB_PACKET
)) {
901 DEBUG ((DEBUG_INFO
, "Packet too small for SubPacket\n"));
902 return (TcgResultFailureBufferTooSmall
);
905 ParseStruct
->CurSubPacket
= (TCG_SUB_PACKET
*)ParseStruct
->CurPacket
->Payload
;
909 //TODO should check for method status list at this point?
911 return (TcgResultSuccess
);
917 @param ParseStruct Input parse structure info.
918 @param TcgToken return the tcg token info.
920 @retval return the action result.
926 TCG_PARSE_STRUCT
*ParseStruct
,
930 const UINT8
* EndOfSubPacket
;
933 TCG_SIMPLE_TOKEN_SHORT_ATOM
* TmpShort
;
934 const TCG_SIMPLE_TOKEN_MEDIUM_ATOM
* TmpMed
;
935 const TCG_SIMPLE_TOKEN_LONG_ATOM
* TmpLong
;
937 NULL_CHECK(ParseStruct
);
938 NULL_CHECK(TcgToken
);
940 if (ParseStruct
->ComPacket
== NULL
||
941 ParseStruct
->CurPacket
== NULL
||
942 ParseStruct
->CurSubPacket
== NULL
944 DEBUG ((DEBUG_INFO
, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", ParseStruct
->ComPacket
, ParseStruct
->CurPacket
, ParseStruct
->CurSubPacket
));
945 return TcgResultFailureInvalidAction
;
948 // initial call, start at sub packet
949 if (ParseStruct
->CurPtr
== NULL
) {
950 ParseStruct
->CurPtr
= ParseStruct
->CurSubPacket
->Payload
;
953 EndOfSubPacket
= ParseStruct
->CurSubPacket
->Payload
+ SwapBytes32(ParseStruct
->CurSubPacket
->LengthBE
);
956 // confirmed that subpacket Length falls within end of Buffer and TCG_COM_PACKET,
957 // so simply need to verify the loop stays within current subpacket
958 if (ParseStruct
->CurPtr
>= EndOfSubPacket
) {
959 DEBUG ((DEBUG_INFO
, "ParseStruct->CurPtr >= EndOfSubPacket\n"));
960 return (TcgResultFailureEndBuffer
);
963 Hdr
= *ParseStruct
->CurPtr
;
964 TcgToken
->HdrStart
= ParseStruct
->CurPtr
;
968 // tiny atom Header is only 1 byte, so don't need to verify Size before cast and access
969 TcgToken
->Type
= TcgTokenTypeTinyAtom
;
971 TokenEnd
= TcgToken
->HdrStart
+ sizeof(TCG_SIMPLE_TOKEN_TINY_ATOM
);
973 // verify caller will have enough Size to reference token
974 if (TokenEnd
>= EndOfSubPacket
) {
975 DEBUG ((DEBUG_INFO
, "Tiny Atom TokenEnd >= EndOfSubPacket\n"));
976 return (TcgResultFailureEndBuffer
);
980 else if (0x80 <= Hdr
&& Hdr
<= 0xBF) {
981 // short atom Header is only 1 byte, so don't need to verify Size before cast and access
982 TmpShort
= (TCG_SIMPLE_TOKEN_SHORT_ATOM
*)(ParseStruct
->CurPtr
);
983 TcgToken
->Type
= TcgTokenTypeShortAtom
;
985 TokenEnd
= (TcgToken
->HdrStart
+ sizeof(TCG_SIMPLE_TOKEN_SHORT_ATOM
) + TmpShort
->ShortAtomBits
.Length
);
987 // verify caller will have enough Size to reference token
988 if (TokenEnd
>= EndOfSubPacket
) {
989 DEBUG ((DEBUG_INFO
, "Short Atom TokenEnd >= EndOfSubPacket\n"));
990 return (TcgResultFailureEndBuffer
);
994 else if (0xC0 <= Hdr
&& Hdr
<= 0xDF) {
995 if (TcgToken
->HdrStart
+ sizeof(TCG_SIMPLE_TOKEN_MEDIUM_ATOM
) >= EndOfSubPacket
) {
996 return (TcgResultFailureEndBuffer
);
998 TmpMed
= (const TCG_SIMPLE_TOKEN_MEDIUM_ATOM
*)ParseStruct
->CurPtr
;
999 TcgToken
->Type
= TcgTokenTypeMediumAtom
;
1000 TokenEnd
= TcgToken
->HdrStart
+ sizeof(TCG_SIMPLE_TOKEN_MEDIUM_ATOM
) +
1001 ((TmpMed
->MediumAtomBits
.LengthHigh
<< TCG_MEDIUM_ATOM_LENGTH_HIGH_SHIFT
) |
1002 TmpMed
->MediumAtomBits
.LengthLow
);
1004 // verify caller will have enough Size to reference token
1005 if (TokenEnd
>= EndOfSubPacket
) {
1006 DEBUG ((DEBUG_INFO
, "Medium Atom TokenEnd >= EndOfSubPacket\n"));
1007 return (TcgResultFailureEndBuffer
);
1011 else if (0xE0 <= Hdr
&& Hdr
<= 0xE3) {
1012 if (TcgToken
->HdrStart
+ sizeof(TCG_SIMPLE_TOKEN_LONG_ATOM
) >= EndOfSubPacket
) {
1013 return (TcgResultFailureEndBuffer
);
1015 TmpLong
= (const TCG_SIMPLE_TOKEN_LONG_ATOM
*)ParseStruct
->CurPtr
;
1016 TcgToken
->Type
= TcgTokenTypeLongAtom
;
1018 TokenEnd
= TcgToken
->HdrStart
+ sizeof(TCG_SIMPLE_TOKEN_LONG_ATOM
) +
1019 ((TmpLong
->LongAtomBits
.LengthHigh
<< TCG_LONG_ATOM_LENGTH_HIGH_SHIFT
) |
1020 (TmpLong
->LongAtomBits
.LengthMid
<< TCG_LONG_ATOM_LENGTH_MID_SHIFT
) |
1021 TmpLong
->LongAtomBits
.LengthLow
);
1023 // verify caller will have enough Size to reference token
1024 if (TokenEnd
>= EndOfSubPacket
) {
1025 DEBUG ((DEBUG_INFO
, "Long Atom TokenEnd >= EndOfSubPacket\n"));
1026 return (TcgResultFailureEndBuffer
);
1029 // single byte tokens
1031 case TCG_TOKEN_STARTLIST
:
1032 TcgToken
->Type
= TcgTokenTypeStartList
;
1034 case TCG_TOKEN_ENDLIST
:
1035 TcgToken
->Type
= TcgTokenTypeEndList
;
1037 case TCG_TOKEN_STARTNAME
:
1038 TcgToken
->Type
= TcgTokenTypeStartName
;
1040 case TCG_TOKEN_ENDNAME
:
1041 TcgToken
->Type
= TcgTokenTypeEndName
;
1043 case TCG_TOKEN_CALL
:
1044 TcgToken
->Type
= TcgTokenTypeCall
;
1046 case TCG_TOKEN_ENDDATA
:
1047 TcgToken
->Type
= TcgTokenTypeEndOfData
;
1049 case TCG_TOKEN_ENDSESSION
:
1050 TcgToken
->Type
= TcgTokenTypeEndOfSession
;
1052 case TCG_TOKEN_STARTTRANSACTION
:
1053 TcgToken
->Type
= TcgTokenTypeStartTransaction
;
1055 case TCG_TOKEN_ENDTRANSACTION
:
1056 TcgToken
->Type
= TcgTokenTypeEndTransaction
;
1058 case TCG_TOKEN_EMPTY
:
1059 TcgToken
->Type
= TcgTokenTypeEmptyAtom
;
1062 DEBUG ((DEBUG_INFO
, "WARNING: reserved token Type 0x%02X\n", Hdr
));
1063 TcgToken
->Type
= TcgTokenTypeReserved
;
1066 ParseStruct
->CurPtr
++;
1067 TokenEnd
= TcgToken
->HdrStart
+ 1;
1070 // increment curptr for next call
1071 ParseStruct
->CurPtr
= TokenEnd
;
1072 return (TcgResultSuccess
);
1078 @param TcgToken Input token info.
1079 @param HeaderLength return the header length.
1080 @param DataLength return the data length.
1081 @param ByteOrInt return the atom Type.
1082 @param SignOrCont return the sign or count info.
1084 @retval return the action result.
1090 const TCG_TOKEN
*TcgToken
,
1091 UINT32
*HeaderLength
,
1097 TCG_SIMPLE_TOKEN_TINY_ATOM
* TinyAtom
;
1098 TCG_SIMPLE_TOKEN_SHORT_ATOM
* ShortAtom
;
1099 TCG_SIMPLE_TOKEN_MEDIUM_ATOM
* MediumAtom
;
1100 TCG_SIMPLE_TOKEN_LONG_ATOM
* LongAtom
;
1102 NULL_CHECK(TcgToken
);
1103 NULL_CHECK(HeaderLength
);
1104 NULL_CHECK(DataLength
);
1105 NULL_CHECK(ByteOrInt
);
1106 NULL_CHECK(SignOrCont
);
1108 switch (TcgToken
->Type
) {
1109 case TcgTokenTypeTinyAtom
: {
1110 TinyAtom
= (TCG_SIMPLE_TOKEN_TINY_ATOM
*)TcgToken
->HdrStart
;
1111 *ByteOrInt
= TCG_ATOM_TYPE_INTEGER
;
1112 *SignOrCont
= TinyAtom
->TinyAtomBits
.Sign
;
1114 *DataLength
= 0; // tiny atom must be handled as a special case - Header and Data in the same byte
1115 return TcgResultSuccess
;
1118 case TcgTokenTypeShortAtom
: {
1119 ShortAtom
= (TCG_SIMPLE_TOKEN_SHORT_ATOM
*)TcgToken
->HdrStart
;
1120 *ByteOrInt
= ShortAtom
->ShortAtomBits
.ByteOrInt
;
1121 *SignOrCont
= ShortAtom
->ShortAtomBits
.SignOrCont
;
1122 *HeaderLength
= sizeof(TCG_SIMPLE_TOKEN_SHORT_ATOM
);
1123 *DataLength
= ShortAtom
->ShortAtomBits
.Length
;
1124 return TcgResultSuccess
;
1127 case TcgTokenTypeMediumAtom
: {
1128 MediumAtom
= (TCG_SIMPLE_TOKEN_MEDIUM_ATOM
*)TcgToken
->HdrStart
;
1129 *ByteOrInt
= MediumAtom
->MediumAtomBits
.ByteOrInt
;
1130 *SignOrCont
= MediumAtom
->MediumAtomBits
.SignOrCont
;
1131 *HeaderLength
= sizeof(TCG_SIMPLE_TOKEN_MEDIUM_ATOM
);
1132 *DataLength
= (MediumAtom
->MediumAtomBits
.LengthHigh
<< TCG_MEDIUM_ATOM_LENGTH_HIGH_SHIFT
) | MediumAtom
->MediumAtomBits
.LengthLow
;
1133 return TcgResultSuccess
;
1136 case TcgTokenTypeLongAtom
: {
1137 LongAtom
= (TCG_SIMPLE_TOKEN_LONG_ATOM
*)TcgToken
->HdrStart
;
1138 *ByteOrInt
= LongAtom
->LongAtomBits
.ByteOrInt
;
1139 *SignOrCont
= LongAtom
->LongAtomBits
.SignOrCont
;
1140 *HeaderLength
= sizeof(TCG_SIMPLE_TOKEN_LONG_ATOM
);
1141 *DataLength
= (LongAtom
->LongAtomBits
.LengthHigh
<< TCG_LONG_ATOM_LENGTH_HIGH_SHIFT
) |
1142 (LongAtom
->LongAtomBits
.LengthMid
<< TCG_LONG_ATOM_LENGTH_MID_SHIFT
) |
1143 LongAtom
->LongAtomBits
.LengthLow
;
1144 return TcgResultSuccess
;
1148 DEBUG ((DEBUG_INFO
, "Token Type is not simple atom (%d)\n", TcgToken
->Type
));
1149 return (TcgResultFailureInvalidType
);
1154 Get token specified value.
1156 @param TcgToken Input token info.
1157 @param Value return the value.
1159 @retval return the action result.
1165 const TCG_TOKEN
*TcgToken
,
1173 TCG_SIMPLE_TOKEN_TINY_ATOM
* TmpTiny
;
1177 NULL_CHECK(TcgToken
);
1182 ERROR_CHECK(TcgGetAtomInfo(TcgToken
, &HdrLength
, &DataLength
, &ByteOrInt
, &IsSigned
));
1184 if (ByteOrInt
!= TCG_ATOM_TYPE_INTEGER
) {
1185 DEBUG ((DEBUG_INFO
, "Invalid Type, expected integer not byte sequence\n"));
1186 return TcgResultFailureInvalidType
;
1189 if (IsSigned
!= 0) {
1190 DEBUG ((DEBUG_INFO
, "Integer is signed, expected unsigned\n"));
1191 return TcgResultFailureInvalidType
;
1194 // special case for tiny atom
1195 // Header and Data are in one byte, so extract only the Data bitfield
1196 if (TcgToken
->Type
== TcgTokenTypeTinyAtom
) {
1197 TmpTiny
= (TCG_SIMPLE_TOKEN_TINY_ATOM
*)TcgToken
->HdrStart
;
1198 *Value
= TmpTiny
->TinyAtomBits
.Data
;
1199 return TcgResultSuccess
;
1202 if (DataLength
> sizeof(UINT64
)) {
1203 DEBUG ((DEBUG_INFO
, "Length %d is greater than Size of UINT64\n", DataLength
));
1204 return TcgResultFailureBufferTooSmall
;
1207 // read big-endian integer
1208 Data
= TcgToken
->HdrStart
+ HdrLength
;
1209 for (Index
= 0; Index
< DataLength
; Index
++) {
1210 *Value
= LShiftU64(*Value
, 8) | Data
[Index
];
1213 return TcgResultSuccess
;
1217 Get token byte sequence.
1219 @param TcgToken Input token info.
1220 @param Length Input the length info.
1222 @retval Return the value data.
1227 TcgGetTokenByteSequence(
1228 const TCG_TOKEN
*TcgToken
,
1236 if (TcgToken
== NULL
|| Length
== NULL
) {
1241 if (TcgGetAtomInfo(TcgToken
, &HdrLength
, Length
, &ByteOrInt
, &SignOrCont
) != TcgResultSuccess
) {
1242 DEBUG ((DEBUG_INFO
, "Failed to get simple token info\n"));
1246 if (ByteOrInt
!= TCG_ATOM_TYPE_BYTE
) {
1247 DEBUG ((DEBUG_INFO
, "Invalid Type, expected byte sequence not integer\n"));
1251 return (TcgToken
->HdrStart
+ HdrLength
);
1255 Get next specify value.
1257 @param ParseStruct Input parse structure.
1258 @param Value Return vlaue.
1260 @retval return the action result.
1266 TCG_PARSE_STRUCT
*ParseStruct
,
1275 ERROR_CHECK(TcgGetNextToken(ParseStruct
, &Tok
));
1276 ERROR_CHECK(TcgGetTokenUINT64(&Tok
, &Value64
));
1278 if (Value64
> MAX_UINT8
) {
1279 return TcgResultFailure
;
1282 *Value
= (UINT8
)Value64
;
1284 return TcgResultSuccess
;
1288 Get next specify value.
1290 @param ParseStruct Input parse structure.
1291 @param Value Return vlaue.
1293 @retval return the action result.
1299 TCG_PARSE_STRUCT
*ParseStruct
,
1308 ERROR_CHECK(TcgGetNextToken(ParseStruct
, &Tok
));
1309 ERROR_CHECK(TcgGetTokenUINT64(&Tok
, &Value64
));
1311 if (Value64
> MAX_UINT16
) {
1312 return TcgResultFailure
;
1315 *Value
= (UINT16
)Value64
;
1317 return TcgResultSuccess
;
1321 Get next specify value.
1323 @param ParseStruct Input parse structure.
1324 @param Value Return vlaue.
1326 @retval return the action result.
1332 TCG_PARSE_STRUCT
*ParseStruct
,
1341 ERROR_CHECK(TcgGetNextToken(ParseStruct
, &Tok
));
1342 ERROR_CHECK(TcgGetTokenUINT64(&Tok
, &Value64
));
1344 if (Value64
> MAX_UINT32
) {
1345 return TcgResultFailure
;
1348 *Value
= (UINT32
)Value64
;
1350 return TcgResultSuccess
;
1354 Get next specify value.
1356 @param ParseStruct Input parse structure.
1357 @param Value Return vlaue.
1359 @retval return the action result.
1365 TCG_PARSE_STRUCT
*ParseStruct
,
1370 ERROR_CHECK(TcgGetNextToken(ParseStruct
, &Tok
));
1371 ERROR_CHECK(TcgGetTokenUINT64(&Tok
, Value
));
1372 return TcgResultSuccess
;
1376 Get next specify value.
1378 @param ParseStruct Input parse structure.
1379 @param Value Return vlaue.
1381 @retval return the action result.
1387 TCG_PARSE_STRUCT
*ParseStruct
,
1396 ERROR_CHECK(TcgGetNextToken(ParseStruct
, &Tok
));
1397 ERROR_CHECK(TcgGetTokenUINT64(&Tok
, &Value64
));
1400 return TcgResultFailure
;
1403 *Value
= (BOOLEAN
)Value64
;
1405 return TcgResultSuccess
;
1409 Get next tcg uid info.
1411 @param ParseStruct Input parse structure.
1412 @param Uid Get the uid info.
1414 @retval return the action result.
1420 TCG_PARSE_STRUCT
*ParseStruct
,
1426 const UINT8
* ByteSeq
;
1430 ERROR_CHECK(TcgGetNextToken(ParseStruct
, &Tok
));
1431 ByteSeq
= TcgGetTokenByteSequence(&Tok
, &Length
);
1433 if (Length
!= sizeof(TCG_UID
)) {
1434 DEBUG ((DEBUG_INFO
, "Token Length %u != TCG_UID Size %u\n", Length
, (UINT32
)sizeof(TCG_UID
)));
1435 return TcgResultFailure
;
1438 ASSERT (ByteSeq
!= NULL
);
1440 CopyMem(Uid
, ByteSeq
, sizeof(TCG_UID
));
1442 return TcgResultSuccess
;
1446 Get next byte sequence.
1448 @param ParseStruct Input parse structure.
1449 @param Data return the data.
1450 @param Length return the length.
1452 @retval return the action result.
1457 TcgGetNextByteSequence(
1458 TCG_PARSE_STRUCT
*ParseStruct
,
1466 ERROR_CHECK(TcgGetNextToken(ParseStruct
, &Tok
));
1467 Bs
= TcgGetTokenByteSequence(&Tok
, Length
);
1470 return TcgResultFailure
;
1473 return TcgResultSuccess
;
1477 Get next token Type.
1479 @param ParseStruct Input parse structure.
1480 @param Type Input the type need to check.
1482 @retval return the action result.
1487 TcgGetNextTokenType(
1488 TCG_PARSE_STRUCT
*ParseStruct
,
1493 ERROR_CHECK(TcgGetNextToken(ParseStruct
, &Tok
));
1494 if (Tok
.Type
!= Type
) {
1495 DEBUG ((DEBUG_INFO
, "expected Type %u, got Type %u\n", Type
, Tok
.Type
));
1496 return TcgResultFailure
;
1498 return TcgResultSuccess
;
1502 Get next start list.
1504 @param ParseStruct Input parse structure.
1506 @retval return the action result.
1511 TcgGetNextStartList(
1512 TCG_PARSE_STRUCT
*ParseStruct
1515 return TcgGetNextTokenType(ParseStruct
, TcgTokenTypeStartList
);
1521 @param ParseStruct Input parse structure.
1523 @retval return the action result.
1529 TCG_PARSE_STRUCT
*ParseStruct
1532 return TcgGetNextTokenType(ParseStruct
, TcgTokenTypeEndList
);
1536 Get next start name.
1538 @param ParseStruct Input parse structure.
1540 @retval return the action result.
1545 TcgGetNextStartName(
1546 TCG_PARSE_STRUCT
*ParseStruct
1549 return TcgGetNextTokenType(ParseStruct
, TcgTokenTypeStartName
);
1555 @param ParseStruct Input parse structure.
1557 @retval return the action result.
1563 TCG_PARSE_STRUCT
*ParseStruct
1566 return TcgGetNextTokenType(ParseStruct
, TcgTokenTypeEndName
);
1572 @param ParseStruct Input parse structure.
1574 @retval return the action result.
1580 TCG_PARSE_STRUCT
*ParseStruct
1583 return TcgGetNextTokenType(ParseStruct
, TcgTokenTypeCall
);
1589 @param ParseStruct Input parse structure.
1591 @retval return the action result.
1596 TcgGetNextEndOfData(
1597 TCG_PARSE_STRUCT
*ParseStruct
1600 return TcgGetNextTokenType(ParseStruct
, TcgTokenTypeEndOfData
);
1604 Get next end of session.
1606 @param ParseStruct Input parse structure.
1608 @retval return the action result.
1613 TcgGetNextEndOfSession(
1614 TCG_PARSE_STRUCT
*ParseStruct
1617 return TcgGetNextTokenType(ParseStruct
, TcgTokenTypeEndOfSession
);
1621 Get next start transaction.
1623 @param ParseStruct Input parse structure.
1625 @retval return the action result.
1630 TcgGetNextStartTransaction(
1631 TCG_PARSE_STRUCT
*ParseStruct
1634 return TcgGetNextTokenType(ParseStruct
, TcgTokenTypeStartTransaction
);
1638 Get next end transaction.
1640 @param ParseStruct Input parse structure.
1642 @retval return the action result.
1647 TcgGetNextEndTransaction(
1648 TCG_PARSE_STRUCT
*ParseStruct
1651 return TcgGetNextTokenType(ParseStruct
, TcgTokenTypeEndTransaction
);