12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646 |
- /** @file
- Provide functions to provide tcg storage core spec related functions.
- Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include <Library/TcgStorageCoreLib.h>
- #include <Library/BaseLib.h>
- #include <Library/BaseMemoryLib.h>
- #include <Library/DebugLib.h>
- //#include <Library/PrintLib.h>
- /**
- Required to be called before calling any other Tcg functions with the TCG_CREATE_STRUCT.
- Initializes the packet variables to NULL. Additionally, the buffer will be memset.
- @param [in/out] CreateStruct Structure to initialize
- @param [in] Buffer Buffer allocated by client of library. It will contain the Tcg encoded packet. This cannot be null.
- @param [in] BufferSize Size of buffer provided. It cannot be 0.
- @retval Return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgInitTcgCreateStruct(
- TCG_CREATE_STRUCT *CreateStruct,
- VOID *Buffer,
- UINT32 BufferSize
- )
- {
- NULL_CHECK(CreateStruct);
- NULL_CHECK(Buffer);
- if (BufferSize == 0) {
- DEBUG ((DEBUG_INFO, "BufferSize=0\n"));
- return (TcgResultFailureZeroSize);
- }
- ZeroMem(Buffer, BufferSize);
- CreateStruct->BufferSize = BufferSize;
- CreateStruct->Buffer = Buffer;
- CreateStruct->ComPacket = NULL;
- CreateStruct->CurPacket = NULL;
- CreateStruct->CurSubPacket = NULL;
- return (TcgResultSuccess);
- }
- /**
- Encodes the ComPacket header to the data structure.
- @param[in/out] CreateStruct Structure to initialize
- @param[in] ComId ComID of the Tcg ComPacket.
- @param[in] ComIdExtension ComID Extension of the Tcg ComPacket.
- **/
- TCG_RESULT
- EFIAPI
- TcgStartComPacket(
- TCG_CREATE_STRUCT *CreateStruct,
- UINT16 ComId,
- UINT16 ComIdExtension
- )
- {
- NULL_CHECK(CreateStruct);
- if (CreateStruct->ComPacket != NULL ||
- CreateStruct->CurPacket != NULL ||
- CreateStruct->CurSubPacket != NULL
- ) {
- DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket,
- CreateStruct->CurSubPacket));
- return (TcgResultFailureInvalidAction);
- }
- if (sizeof(TCG_COM_PACKET) > CreateStruct->BufferSize) {
- DEBUG ((DEBUG_INFO, "BufferSize=0x%X\n", CreateStruct->BufferSize));
- return (TcgResultFailureBufferTooSmall);
- }
- CreateStruct->ComPacket = (TCG_COM_PACKET*)CreateStruct->Buffer;
- CreateStruct->ComPacket->ComIDBE = SwapBytes16(ComId);
- CreateStruct->ComPacket->ComIDExtensionBE = SwapBytes16(ComIdExtension);
- return (TcgResultSuccess);
- }
- /**
- Starts a new ComPacket in the Data structure.
- @param [in/out] CreateStruct Structure used to add Tcg Packet
- @param[in] Tsn Packet Tper session number
- @param[in] Hsn Packet Host session number
- @param[in] SeqNumber Packet Sequence Number
- @param[in] AckType Packet Acknowledge Type
- @param[in] Ack Packet Acknowledge
- **/
- TCG_RESULT
- EFIAPI
- TcgStartPacket(
- TCG_CREATE_STRUCT *CreateStruct,
- UINT32 Tsn,
- UINT32 Hsn,
- UINT32 SeqNumber,
- UINT16 AckType,
- UINT32 Ack
- )
- {
- UINT32 AddedSize;
- NULL_CHECK(CreateStruct);
- AddedSize = 0;
- if (CreateStruct->ComPacket == NULL ||
- CreateStruct->CurPacket != NULL ||
- CreateStruct->CurSubPacket != NULL
- ) {
- DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket, CreateStruct->CurSubPacket));
- return (TcgResultFailureInvalidAction);
- }
- // update TCG_COM_PACKET and packet lengths
- AddedSize = sizeof(TCG_PACKET);
- if ((SwapBytes32(CreateStruct->ComPacket->LengthBE) + AddedSize) > CreateStruct->BufferSize) {
- DEBUG ((DEBUG_INFO, "BufferSize=0x%X\n", CreateStruct->BufferSize));
- return (TcgResultFailureBufferTooSmall);
- }
- CreateStruct->CurPacket = (TCG_PACKET*)(CreateStruct->ComPacket->Payload + SwapBytes32(CreateStruct->ComPacket->LengthBE));
- CreateStruct->CurPacket->TperSessionNumberBE = SwapBytes32( Tsn );
- CreateStruct->CurPacket->HostSessionNumberBE = SwapBytes32( Hsn );
- CreateStruct->CurPacket->SequenceNumberBE = SwapBytes32( SeqNumber );
- CreateStruct->CurPacket->AckTypeBE = SwapBytes16( AckType );
- CreateStruct->CurPacket->AcknowledgementBE = SwapBytes32( Ack );
- CreateStruct->CurPacket->LengthBE = 0;
- // update TCG_COM_PACKET Length for next pointer
- CreateStruct->ComPacket->LengthBE = SwapBytes32( SwapBytes32(CreateStruct->ComPacket->LengthBE) + AddedSize );
- return (TcgResultSuccess);
- }
- /**
- Starts a new SubPacket in the Data structure.
- @param[in/out] CreateStruct Structure used to start Tcg SubPacket
- @param[in] Kind SubPacket kind
- **/
- TCG_RESULT
- EFIAPI
- TcgStartSubPacket(
- TCG_CREATE_STRUCT *CreateStruct,
- UINT16 Kind
- )
- {
- UINT32 AddedSize;
- NULL_CHECK(CreateStruct);
- AddedSize = 0;
- if (CreateStruct->ComPacket == NULL ||
- CreateStruct->CurPacket == NULL ||
- CreateStruct->CurSubPacket != NULL
- ) {
- DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket, CreateStruct->CurSubPacket));
- return (TcgResultFailureInvalidAction);
- }
- AddedSize = sizeof(TCG_SUB_PACKET);
- if ((SwapBytes32(CreateStruct->ComPacket->LengthBE) + AddedSize) > CreateStruct->BufferSize) {
- DEBUG ((DEBUG_INFO, "BufferSize=0x%X\n", CreateStruct->BufferSize));
- return (TcgResultFailureBufferTooSmall);
- }
- CreateStruct->CurSubPacket = (TCG_SUB_PACKET*)(CreateStruct->CurPacket->Payload + SwapBytes32(CreateStruct->CurPacket->LengthBE));
- CreateStruct->CurSubPacket->KindBE = SwapBytes16(Kind);
- // update lengths
- CreateStruct->CurSubPacket->LengthBE = 0;
- // update TCG_COM_PACKET and packet lengths
- CreateStruct->ComPacket->LengthBE = SwapBytes32(SwapBytes32(CreateStruct->ComPacket->LengthBE) + AddedSize);
- CreateStruct->CurPacket->LengthBE = SwapBytes32(SwapBytes32(CreateStruct->CurPacket->LengthBE) + AddedSize);
- return (TcgResultSuccess);
- }
- /**
- Ends the current SubPacket in the Data structure. This function will also perform the 4-byte padding
- required for Subpackets.
- @param[in/out] CreateStruct Structure used to end the current Tcg SubPacket
- **/
- TCG_RESULT
- EFIAPI
- TcgEndSubPacket(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- UINT32 PadSize;
- NULL_CHECK(CreateStruct);
- PadSize = 0;
- if (CreateStruct->ComPacket == NULL ||
- CreateStruct->CurPacket == NULL ||
- CreateStruct->CurSubPacket == NULL
- ) {
- DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket, CreateStruct->CurSubPacket));
- return (TcgResultFailureInvalidAction);
- }
- // align to 4-byte boundaries, so shift padding
- // pad Size does not apply to subpacket Length
- PadSize = TCG_SUBPACKET_ALIGNMENT - (SwapBytes32(CreateStruct->CurSubPacket->LengthBE) & (TCG_SUBPACKET_ALIGNMENT - 1));
- if (PadSize == TCG_SUBPACKET_ALIGNMENT) {
- PadSize = 0;
- }
- if ((SwapBytes32(CreateStruct->ComPacket->LengthBE) + PadSize) > CreateStruct->BufferSize) {
- DEBUG ((DEBUG_INFO, "BufferSize=0x%X\n", CreateStruct->BufferSize));
- return (TcgResultFailureBufferTooSmall);
- }
- CreateStruct->CurPacket->LengthBE = SwapBytes32(SwapBytes32(CreateStruct->CurPacket->LengthBE) + PadSize);
- CreateStruct->ComPacket->LengthBE = SwapBytes32(SwapBytes32(CreateStruct->ComPacket->LengthBE) + PadSize);
- CreateStruct->CurSubPacket = NULL;
- return (TcgResultSuccess);
- }
- /**
- Ends the current Packet in the Data structure.
- @param[in/out] CreateStruct Structure used to end the current Tcg Packet
- **/
- TCG_RESULT
- EFIAPI
- TcgEndPacket(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- NULL_CHECK(CreateStruct);
- if (CreateStruct->ComPacket == NULL ||
- CreateStruct->CurPacket == NULL ||
- CreateStruct->CurSubPacket != NULL
- ) {
- DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket, CreateStruct->CurSubPacket));
- return (TcgResultFailureInvalidAction);
- }
- CreateStruct->CurPacket = NULL;
- return (TcgResultSuccess);
- }
- /**
- Ends the ComPacket in the Data structure and ret
- @param [in/out] CreateStruct Structure used to end the Tcg ComPacket
- @param [in/out] Size Describes the Size of the entire ComPacket (Header and payload). Filled out by function.
- **/
- TCG_RESULT
- EFIAPI
- TcgEndComPacket(
- TCG_CREATE_STRUCT *CreateStruct,
- UINT32 *Size
- )
- {
- NULL_CHECK(CreateStruct);
- NULL_CHECK(Size);
- if (CreateStruct->ComPacket == NULL ||
- CreateStruct->CurPacket != NULL ||
- CreateStruct->CurSubPacket != NULL
- ) {
- DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket, CreateStruct->CurSubPacket));
- return (TcgResultFailureInvalidAction);
- }
- *Size = SwapBytes32(CreateStruct->ComPacket->LengthBE) + sizeof(*CreateStruct->ComPacket);
- CreateStruct->ComPacket = NULL;
- return (TcgResultSuccess);
- }
- /**
- Adds raw Data with optional Header
- @param CreateStruct The create structure.
- @param Header The header structure.
- @param HeaderSize The header size.
- @param Data The data need to add.
- @param DataSize The data size.
- @param ByteSwapData Whether byte or swap data.
- **/
- TCG_RESULT
- TcgAddRawTokenData(
- TCG_CREATE_STRUCT *CreateStruct,
- const VOID *Header,
- UINT8 HeaderSize,
- const VOID *Data,
- UINT32 DataSize,
- BOOLEAN ByteSwapData
- )
- {
- UINT32 AddedSize;
- UINT8* Dest;
- const UINT8* DataBytes;
- UINT32 Index;
- AddedSize = 0;
- Index = 0;
- Dest = NULL;
- NULL_CHECK(CreateStruct);
- if ((HeaderSize != 0 && Header == NULL) ||
- (DataSize != 0 && Data == NULL)
- ) {
- DEBUG ((DEBUG_INFO, "HeaderSize=0x%X Header=%p DataSize=0x%X Data=%p\n", HeaderSize, Header, DataSize, Data));
- return (TcgResultFailureNullPointer);
- }
- if (CreateStruct->ComPacket == NULL ||
- CreateStruct->CurPacket == NULL ||
- CreateStruct->CurSubPacket == NULL
- ) {
- DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", CreateStruct->ComPacket, CreateStruct->CurPacket, CreateStruct->CurSubPacket));
- return (TcgResultFailureInvalidAction);
- }
- // verify there is enough Buffer Size
- AddedSize = HeaderSize + DataSize;
- if ((SwapBytes32(CreateStruct->ComPacket->LengthBE) + AddedSize) > CreateStruct->BufferSize) {
- return (TcgResultFailureBufferTooSmall);
- }
- // Get a pointer to where the new bytes should go
- Dest = CreateStruct->ComPacket->Payload + SwapBytes32(CreateStruct->ComPacket->LengthBE);
- switch (HeaderSize) {
- case sizeof(TCG_SIMPLE_TOKEN_SHORT_ATOM):
- case sizeof(TCG_SIMPLE_TOKEN_MEDIUM_ATOM):
- case sizeof(TCG_SIMPLE_TOKEN_LONG_ATOM):
- CopyMem(Dest, Header, HeaderSize);
- Dest += HeaderSize;
- case 0: // no Header is valid
- break;
- // invalid Header Size
- default:
- DEBUG ((DEBUG_INFO, "unsupported HeaderSize=%u\n", HeaderSize));
- return TcgResultFailure;
- }
- // copy the Data bytes
- if (ByteSwapData) {
- DataBytes = (const UINT8*)Data;
- for (Index = 0; Index < DataSize; Index++) {
- Dest[Index] = DataBytes[DataSize - 1 - Index];
- }
- } else {
- CopyMem(Dest, Data, DataSize);
- }
- // Update all the packet sizes
- CreateStruct->ComPacket->LengthBE = SwapBytes32(SwapBytes32(CreateStruct->ComPacket->LengthBE) + AddedSize);
- CreateStruct->CurPacket->LengthBE = SwapBytes32(SwapBytes32(CreateStruct->CurPacket->LengthBE) + AddedSize);
- CreateStruct->CurSubPacket->LengthBE = SwapBytes32(SwapBytes32(CreateStruct->CurSubPacket->LengthBE) + AddedSize);
- return (TcgResultSuccess);
- }
- /**
- Adds a single raw token byte to the Data structure.
- @param[in/out] CreateStruct Structure used to add the byte
- @param[in] Byte Byte to add
- **/
- TCG_RESULT
- EFIAPI
- TcgAddRawByte(
- TCG_CREATE_STRUCT *CreateStruct,
- UINT8 Byte
- )
- {
- return TcgAddRawTokenData(CreateStruct, NULL, 0, &Byte, 1, FALSE);
- }
- /**
- simple tokens - atoms: tiny, short, medium, long and empty atoms.
- tiny atom can be a signed or unsigned integer.
- short, medium, long can be a signed or unsigned integer OR a complete or non-final byte sequence.
- @param CreateStruct The create structure.
- @param Data The data need to add.
- @param DataSize The data size.
- @param ByteOrInt, Data format is byte or int.
- @param SignOrCont sign or cont.
- **/
- TCG_RESULT
- TcgAddAtom(
- TCG_CREATE_STRUCT *CreateStruct,
- const VOID *Data,
- UINT32 DataSize,
- UINT8 ByteOrInt,
- UINT8 SignOrCont
- )
- {
- const UINT8* DataBytes;
- TCG_SIMPLE_TOKEN_TINY_ATOM TinyAtom;
- TCG_SIMPLE_TOKEN_SHORT_ATOM ShortAtom;
- TCG_SIMPLE_TOKEN_MEDIUM_ATOM MediumAtom;
- TCG_SIMPLE_TOKEN_LONG_ATOM LongAtom;
- NULL_CHECK(CreateStruct);
- if (DataSize == 0) {
- if (ByteOrInt == TCG_ATOM_TYPE_INTEGER) {
- DEBUG ((DEBUG_INFO, "0-Size integer not allowed\n"));
- return TcgResultFailure;
- }
- } else {
- // if DataSize != 0, Data must be valid
- NULL_CHECK(Data);
- }
- // encode Data using the shortest possible atom
- DataBytes = (const UINT8*)Data;
- if ((DataSize == 1) &&
- (ByteOrInt == TCG_ATOM_TYPE_INTEGER) &&
- ((SignOrCont != 0 && ((TCG_TOKEN_TINYATOM_SIGNED_MIN_VALUE <= *(INT8*)Data) && (*(INT8*)Data <= TCG_TOKEN_TINYATOM_SIGNED_MAX_VALUE))) ||
- (SignOrCont == 0 && ((*DataBytes <= TCG_TOKEN_TINYATOM_UNSIGNED_MAX_VALUE))))
- ) {
- TinyAtom.TinyAtomBits.IsZero = 0;
- TinyAtom.TinyAtomBits.Sign = SignOrCont;
- TinyAtom.TinyAtomBits.Data = *DataBytes & TCG_TOKEN_TINYATOM_UNSIGNED_MAX_VALUE;
- return TcgAddRawTokenData(CreateStruct, NULL, 0, (UINT8*)&TinyAtom, sizeof(TCG_SIMPLE_TOKEN_TINY_ATOM), FALSE);
- }
- if (DataSize <= TCG_TOKEN_SHORTATOM_MAX_BYTE_SIZE) {
- ShortAtom.ShortAtomBits.IsOne = 1;
- ShortAtom.ShortAtomBits.IsZero = 0;
- ShortAtom.ShortAtomBits.ByteOrInt = ByteOrInt;
- ShortAtom.ShortAtomBits.SignOrCont = SignOrCont;
- ShortAtom.ShortAtomBits.Length = DataSize & 0x0F;
- return TcgAddRawTokenData(CreateStruct, &ShortAtom, sizeof(TCG_SIMPLE_TOKEN_SHORT_ATOM), Data, DataSize, ByteOrInt == TCG_ATOM_TYPE_INTEGER);
- }
- if (DataSize <= TCG_TOKEN_MEDIUMATOM_MAX_BYTE_SIZE) {
- MediumAtom.MediumAtomBits.IsOne1 = 1;
- MediumAtom.MediumAtomBits.IsOne2 = 1;
- MediumAtom.MediumAtomBits.IsZero = 0;
- MediumAtom.MediumAtomBits.ByteOrInt = ByteOrInt;
- MediumAtom.MediumAtomBits.SignOrCont = SignOrCont;
- MediumAtom.MediumAtomBits.LengthLow = DataSize & 0xFF;
- MediumAtom.MediumAtomBits.LengthHigh = (DataSize >> TCG_MEDIUM_ATOM_LENGTH_HIGH_SHIFT) & TCG_MEDIUM_ATOM_LENGTH_HIGH_MASK;
- return TcgAddRawTokenData(CreateStruct, &MediumAtom, sizeof(TCG_SIMPLE_TOKEN_MEDIUM_ATOM), Data, DataSize, ByteOrInt == TCG_ATOM_TYPE_INTEGER);
- }
- LongAtom.LongAtomBits.IsOne1 = 1;
- LongAtom.LongAtomBits.IsOne2 = 1;
- LongAtom.LongAtomBits.IsOne3 = 1;
- LongAtom.LongAtomBits.IsZero = 0;
- LongAtom.LongAtomBits.ByteOrInt = ByteOrInt;
- LongAtom.LongAtomBits.SignOrCont = SignOrCont;
- LongAtom.LongAtomBits.LengthLow = DataSize & 0xFF;
- LongAtom.LongAtomBits.LengthMid = (DataSize >> TCG_LONG_ATOM_LENGTH_MID_SHIFT) & 0xFF;
- LongAtom.LongAtomBits.LengthHigh = (DataSize >> TCG_LONG_ATOM_LENGTH_HIGH_SHIFT) & 0xFF;
- return TcgAddRawTokenData(CreateStruct, &LongAtom, sizeof(TCG_SIMPLE_TOKEN_LONG_ATOM), Data, DataSize, ByteOrInt == TCG_ATOM_TYPE_INTEGER);
- }
- /**
- Adds the Data parameter as a byte sequence to the Data structure.
- @param[in/out] CreateStruct Structure used to add the byte sequence
- @param[in] Data Byte sequence that will be encoded and copied into Data structure
- @param[in] DataSize Length of Data provided
- @param[in] Continued TRUE if byte sequence is continued or
- FALSE if the Data contains the entire byte sequence to be encoded
- **/
- TCG_RESULT
- EFIAPI
- TcgAddByteSequence(
- TCG_CREATE_STRUCT *CreateStruct,
- const VOID *Data,
- UINT32 DataSize,
- BOOLEAN Continued
- )
- {
- return TcgAddAtom(CreateStruct, Data, DataSize, TCG_ATOM_TYPE_BYTE, Continued ? 1 : 0);
- }
- /**
- Adds an arbitrary-Length integer to the Data structure.
- The integer will be encoded using the shortest possible atom.
- @param[in/out] CreateStruct Structure used to add the integer
- @param[in] Data Integer in host byte order that will be encoded and copied into Data structure
- @param[in] DataSize Length in bytes of the Data provided
- @param[in] SignedInteger TRUE if the integer is signed or FALSE if the integer is unsigned
- **/
- TCG_RESULT
- EFIAPI
- TcgAddInteger(
- TCG_CREATE_STRUCT *CreateStruct,
- const VOID *Data,
- UINT32 DataSize,
- BOOLEAN SignedInteger
- )
- {
- const UINT8* DataBytes;
- UINT32 ActualDataSize;
- BOOLEAN ValueIsNegative;
- NULL_CHECK(CreateStruct);
- NULL_CHECK(Data);
- if (DataSize == 0) {
- DEBUG ((DEBUG_INFO, "invalid DataSize=0\n"));
- return TcgResultFailure;
- }
- DataBytes = (const UINT8*)Data;
- // integer should be represented by smallest atom possible
- // so calculate real Data Size
- ValueIsNegative = SignedInteger && DataBytes[ DataSize - 1 ] & 0x80;
- // assumes native Data is little endian
- // shorten Data to smallest byte representation
- for (ActualDataSize = DataSize; ActualDataSize > 1; ActualDataSize--) {
- // ignore sign extended FFs
- if (ValueIsNegative && (DataBytes[ActualDataSize - 1] != 0xFF)) {
- break;
- } else if (!ValueIsNegative && (DataBytes[ActualDataSize - 1] != 0)) {
- // ignore extended 00s
- break;
- }
- }
- return TcgAddAtom(CreateStruct, Data, ActualDataSize, TCG_ATOM_TYPE_INTEGER, SignedInteger ? 1 : 0);
- }
- /**
- Adds an 8-bit unsigned integer to the Data structure.
- @param[in/out] CreateStruct Structure used to add the integer
- @param[in] Value Integer Value to add
- **/
- TCG_RESULT
- EFIAPI
- TcgAddUINT8(
- TCG_CREATE_STRUCT *CreateStruct,
- UINT8 Value
- )
- {
- return TcgAddInteger(CreateStruct, &Value, sizeof(Value), FALSE);
- }
- /**
- Adds a 16-bit unsigned integer to the Data structure.
- @param[in/out] CreateStruct Structure used to add the integer
- @param[in] Value Integer Value to add
- **/
- TCG_RESULT
- EFIAPI
- TcgAddUINT16 (
- TCG_CREATE_STRUCT *CreateStruct,
- UINT16 Value
- )
- {
- return TcgAddInteger(CreateStruct, &Value, sizeof(Value), FALSE);
- }
- /**
- Adds a 32-bit unsigned integer to the Data structure.
- @param[in/out] CreateStruct Structure used to add the integer
- @param[in] Value Integer Value to add
- **/
- TCG_RESULT
- EFIAPI
- TcgAddUINT32(
- TCG_CREATE_STRUCT *CreateStruct,
- UINT32 Value
- )
- {
- return TcgAddInteger(CreateStruct, &Value, sizeof(Value), FALSE);
- }
- /**
- Adds a 64-bit unsigned integer to the Data structure.
- @param[in/out] CreateStruct Structure used to add the integer
- @param[in] Value Integer Value to add
- **/
- TCG_RESULT
- EFIAPI
- TcgAddUINT64(
- TCG_CREATE_STRUCT *CreateStruct,
- UINT64 Value
- )
- {
- return TcgAddInteger(CreateStruct, &Value, sizeof(Value), FALSE);
- }
- /**
- Adds a BOOLEAN to the Data structure.
- @param[in/out] CreateStruct Structure used to add the integer
- @param[in] Value BOOLEAN Value to add
- **/
- TCG_RESULT
- EFIAPI
- TcgAddBOOLEAN(
- TCG_CREATE_STRUCT *CreateStruct,
- BOOLEAN Value
- )
- {
- return TcgAddInteger(CreateStruct, &Value, sizeof(Value), FALSE);
- }
- /**
- Add tcg uid info.
- @param [in/out] CreateStruct Structure used to add the integer
- @param Uid Input uid info.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgAddTcgUid(
- TCG_CREATE_STRUCT *CreateStruct,
- TCG_UID Uid
- )
- {
- return TcgAddByteSequence(CreateStruct, &Uid, sizeof(TCG_UID), FALSE);
- }
- /**
- Add start list.
- @param [in/out] CreateStruct Structure used to add the integer
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgAddStartList(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- return TcgAddRawByte(CreateStruct, TCG_TOKEN_STARTLIST);
- }
- /**
- Add end list.
- @param [in/out] CreateStruct Structure used to add the integer
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgAddEndList(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- return TcgAddRawByte(CreateStruct, TCG_TOKEN_ENDLIST);
- }
- /**
- Add start name.
- @param [in/out] CreateStruct Structure used to add the integer
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgAddStartName(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- return TcgAddRawByte(CreateStruct, TCG_TOKEN_STARTNAME);
- }
- /**
- Add end name.
- @param [in/out] CreateStruct Structure used to add the integer
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgAddEndName(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- return TcgAddRawByte(CreateStruct, TCG_TOKEN_ENDNAME);
- }
- /**
- Add end call.
- @param [in/out] CreateStruct Structure used to add the integer
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgAddCall(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- return TcgAddRawByte(CreateStruct, TCG_TOKEN_CALL);
- }
- /**
- Add end of data.
- @param [in/out] CreateStruct Structure used to add the integer
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgAddEndOfData(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- return TcgAddRawByte(CreateStruct, TCG_TOKEN_ENDDATA);
- }
- /**
- Add end of session.
- @param [in/out] CreateStruct Structure used to add the integer
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgAddEndOfSession(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- return TcgAddRawByte(CreateStruct, TCG_TOKEN_ENDSESSION);
- }
- /**
- Add start transaction.
- @param [in/out] CreateStruct Structure used to add the integer
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgAddStartTransaction(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- return TcgAddRawByte(CreateStruct, TCG_TOKEN_STARTTRANSACTION);
- }
- /**
- Add end transaction.
- @param [in/out] CreateStruct Structure used to add the integer
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgAddEndTransaction(
- TCG_CREATE_STRUCT *CreateStruct
- )
- {
- return TcgAddRawByte(CreateStruct, TCG_TOKEN_ENDTRANSACTION);
- }
- /**
- Initial the tcg parse stucture.
- @param ParseStruct Input parse structure.
- @param Buffer Input buffer data.
- @param BufferSize Input buffer size.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgInitTcgParseStruct(
- TCG_PARSE_STRUCT *ParseStruct,
- const VOID *Buffer,
- UINT32 BufferSize
- )
- {
- UINT32 ComPacketLength;
- UINT32 PacketLength;
- NULL_CHECK(ParseStruct);
- NULL_CHECK(Buffer);
- if (BufferSize < sizeof(TCG_COM_PACKET)) {
- return (TcgResultFailureBufferTooSmall);
- }
- ParseStruct->ComPacket = (TCG_COM_PACKET*)Buffer;
- ComPacketLength = SwapBytes32(ParseStruct->ComPacket->LengthBE);
- if ((BufferSize - sizeof(TCG_COM_PACKET)) < ComPacketLength) {
- DEBUG ((DEBUG_INFO, "Buffer %u too small for ComPacket %u\n", BufferSize, ComPacketLength));
- return (TcgResultFailureBufferTooSmall);
- }
- ParseStruct->BufferSize = BufferSize;
- ParseStruct->Buffer = Buffer;
- ParseStruct->CurPacket = NULL;
- ParseStruct->CurSubPacket = NULL;
- ParseStruct->CurPtr = NULL;
- // if payload > 0, then must have a packet
- if (ComPacketLength != 0) {
- if (ComPacketLength < sizeof(TCG_PACKET)) {
- DEBUG ((DEBUG_INFO, "ComPacket too small for Packet\n"));
- return (TcgResultFailureBufferTooSmall);
- }
- ParseStruct->CurPacket = (TCG_PACKET*)ParseStruct->ComPacket->Payload;
- PacketLength = SwapBytes32(ParseStruct->CurPacket->LengthBE);
- if (PacketLength > 0) {
- if (PacketLength < sizeof(TCG_SUB_PACKET)) {
- DEBUG ((DEBUG_INFO, "Packet too small for SubPacket\n"));
- return (TcgResultFailureBufferTooSmall);
- }
- ParseStruct->CurSubPacket = (TCG_SUB_PACKET*)ParseStruct->CurPacket->Payload;
- }
- }
- //TODO should check for method status list at this point?
- return (TcgResultSuccess);
- }
- /**
- Get next token info.
- @param ParseStruct Input parse structure info.
- @param TcgToken return the tcg token info.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextToken(
- TCG_PARSE_STRUCT *ParseStruct,
- TCG_TOKEN *TcgToken
- )
- {
- const UINT8* EndOfSubPacket;
- UINT8* TokenEnd;
- UINT8 Hdr;
- TCG_SIMPLE_TOKEN_SHORT_ATOM* TmpShort;
- const TCG_SIMPLE_TOKEN_MEDIUM_ATOM* TmpMed;
- const TCG_SIMPLE_TOKEN_LONG_ATOM* TmpLong;
- NULL_CHECK(ParseStruct);
- NULL_CHECK(TcgToken);
- if (ParseStruct->ComPacket == NULL ||
- ParseStruct->CurPacket == NULL ||
- ParseStruct->CurSubPacket == NULL
- ) {
- DEBUG ((DEBUG_INFO, "unexpected state: ComPacket=%p CurPacket=%p CurSubPacket=%p\n", ParseStruct->ComPacket, ParseStruct->CurPacket, ParseStruct->CurSubPacket));
- return TcgResultFailureInvalidAction;
- }
- // initial call, start at sub packet
- if (ParseStruct->CurPtr == NULL) {
- ParseStruct->CurPtr = ParseStruct->CurSubPacket->Payload;
- }
- EndOfSubPacket = ParseStruct->CurSubPacket->Payload + SwapBytes32(ParseStruct->CurSubPacket->LengthBE);
- TokenEnd = NULL;
- // confirmed that subpacket Length falls within end of Buffer and TCG_COM_PACKET,
- // so simply need to verify the loop stays within current subpacket
- if (ParseStruct->CurPtr >= EndOfSubPacket) {
- DEBUG ((DEBUG_INFO, "ParseStruct->CurPtr >= EndOfSubPacket\n"));
- return (TcgResultFailureEndBuffer);
- }
- Hdr = *ParseStruct->CurPtr;
- TcgToken->HdrStart = ParseStruct->CurPtr;
- // Tiny Atom range
- if (Hdr <= 0x7F) {
- // tiny atom Header is only 1 byte, so don't need to verify Size before cast and access
- TcgToken->Type = TcgTokenTypeTinyAtom;
- TokenEnd = TcgToken->HdrStart + sizeof(TCG_SIMPLE_TOKEN_TINY_ATOM);
- // verify caller will have enough Size to reference token
- if (TokenEnd >= EndOfSubPacket) {
- DEBUG ((DEBUG_INFO, "Tiny Atom TokenEnd >= EndOfSubPacket\n"));
- return (TcgResultFailureEndBuffer);
- }
- }
- // Short Atom Range
- else if (0x80 <= Hdr && Hdr <= 0xBF) {
- // short atom Header is only 1 byte, so don't need to verify Size before cast and access
- TmpShort = (TCG_SIMPLE_TOKEN_SHORT_ATOM*)(ParseStruct->CurPtr);
- TcgToken->Type = TcgTokenTypeShortAtom;
- TokenEnd = (TcgToken->HdrStart + sizeof(TCG_SIMPLE_TOKEN_SHORT_ATOM) + TmpShort->ShortAtomBits.Length);
- // verify caller will have enough Size to reference token
- if (TokenEnd >= EndOfSubPacket) {
- DEBUG ((DEBUG_INFO, "Short Atom TokenEnd >= EndOfSubPacket\n"));
- return (TcgResultFailureEndBuffer);
- }
- }
- // Medium Atom Range
- else if (0xC0 <= Hdr && Hdr <= 0xDF) {
- if (TcgToken->HdrStart + sizeof(TCG_SIMPLE_TOKEN_MEDIUM_ATOM) >= EndOfSubPacket) {
- return (TcgResultFailureEndBuffer);
- }
- TmpMed = (const TCG_SIMPLE_TOKEN_MEDIUM_ATOM*)ParseStruct->CurPtr;
- TcgToken->Type = TcgTokenTypeMediumAtom;
- TokenEnd = TcgToken->HdrStart + sizeof(TCG_SIMPLE_TOKEN_MEDIUM_ATOM) +
- ((TmpMed->MediumAtomBits.LengthHigh << TCG_MEDIUM_ATOM_LENGTH_HIGH_SHIFT) |
- TmpMed->MediumAtomBits.LengthLow);
- // verify caller will have enough Size to reference token
- if (TokenEnd >= EndOfSubPacket) {
- DEBUG ((DEBUG_INFO, "Medium Atom TokenEnd >= EndOfSubPacket\n"));
- return (TcgResultFailureEndBuffer);
- }
- }
- // Long Atom Range
- else if (0xE0 <= Hdr && Hdr <= 0xE3) {
- if (TcgToken->HdrStart + sizeof(TCG_SIMPLE_TOKEN_LONG_ATOM) >= EndOfSubPacket) {
- return (TcgResultFailureEndBuffer);
- }
- TmpLong = (const TCG_SIMPLE_TOKEN_LONG_ATOM*)ParseStruct->CurPtr;
- TcgToken->Type = TcgTokenTypeLongAtom;
- TokenEnd = TcgToken->HdrStart + sizeof(TCG_SIMPLE_TOKEN_LONG_ATOM) +
- ((TmpLong->LongAtomBits.LengthHigh << TCG_LONG_ATOM_LENGTH_HIGH_SHIFT) |
- (TmpLong->LongAtomBits.LengthMid << TCG_LONG_ATOM_LENGTH_MID_SHIFT) |
- TmpLong->LongAtomBits.LengthLow);
- // verify caller will have enough Size to reference token
- if (TokenEnd >= EndOfSubPacket) {
- DEBUG ((DEBUG_INFO, "Long Atom TokenEnd >= EndOfSubPacket\n"));
- return (TcgResultFailureEndBuffer);
- }
- } else {
- // single byte tokens
- switch (Hdr) {
- case TCG_TOKEN_STARTLIST:
- TcgToken->Type = TcgTokenTypeStartList;
- break;
- case TCG_TOKEN_ENDLIST:
- TcgToken->Type = TcgTokenTypeEndList;
- break;
- case TCG_TOKEN_STARTNAME:
- TcgToken->Type = TcgTokenTypeStartName;
- break;
- case TCG_TOKEN_ENDNAME:
- TcgToken->Type = TcgTokenTypeEndName;
- break;
- case TCG_TOKEN_CALL:
- TcgToken->Type = TcgTokenTypeCall;
- break;
- case TCG_TOKEN_ENDDATA:
- TcgToken->Type = TcgTokenTypeEndOfData;
- break;
- case TCG_TOKEN_ENDSESSION:
- TcgToken->Type = TcgTokenTypeEndOfSession;
- break;
- case TCG_TOKEN_STARTTRANSACTION:
- TcgToken->Type = TcgTokenTypeStartTransaction;
- break;
- case TCG_TOKEN_ENDTRANSACTION:
- TcgToken->Type = TcgTokenTypeEndTransaction;
- break;
- case TCG_TOKEN_EMPTY:
- TcgToken->Type = TcgTokenTypeEmptyAtom;
- break;
- default:
- DEBUG ((DEBUG_INFO, "WARNING: reserved token Type 0x%02X\n", Hdr));
- TcgToken->Type = TcgTokenTypeReserved;
- break;
- }
- ParseStruct->CurPtr++;
- TokenEnd = TcgToken->HdrStart + 1;
- }
- // increment curptr for next call
- ParseStruct->CurPtr = TokenEnd;
- return (TcgResultSuccess);
- }
- /**
- Get atom info.
- @param TcgToken Input token info.
- @param HeaderLength return the header length.
- @param DataLength return the data length.
- @param ByteOrInt return the atom Type.
- @param SignOrCont return the sign or count info.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetAtomInfo(
- const TCG_TOKEN *TcgToken,
- UINT32 *HeaderLength,
- UINT32 *DataLength,
- UINT8 *ByteOrInt,
- UINT8 *SignOrCont
- )
- {
- TCG_SIMPLE_TOKEN_TINY_ATOM* TinyAtom;
- TCG_SIMPLE_TOKEN_SHORT_ATOM* ShortAtom;
- TCG_SIMPLE_TOKEN_MEDIUM_ATOM* MediumAtom;
- TCG_SIMPLE_TOKEN_LONG_ATOM* LongAtom;
- NULL_CHECK(TcgToken);
- NULL_CHECK(HeaderLength);
- NULL_CHECK(DataLength);
- NULL_CHECK(ByteOrInt);
- NULL_CHECK(SignOrCont);
- switch (TcgToken->Type) {
- case TcgTokenTypeTinyAtom: {
- TinyAtom = (TCG_SIMPLE_TOKEN_TINY_ATOM*)TcgToken->HdrStart;
- *ByteOrInt = TCG_ATOM_TYPE_INTEGER;
- *SignOrCont = TinyAtom->TinyAtomBits.Sign;
- *HeaderLength = 0;
- *DataLength = 0; // tiny atom must be handled as a special case - Header and Data in the same byte
- return TcgResultSuccess;
- }
- case TcgTokenTypeShortAtom: {
- ShortAtom = (TCG_SIMPLE_TOKEN_SHORT_ATOM*)TcgToken->HdrStart;
- *ByteOrInt = ShortAtom->ShortAtomBits.ByteOrInt;
- *SignOrCont = ShortAtom->ShortAtomBits.SignOrCont;
- *HeaderLength = sizeof(TCG_SIMPLE_TOKEN_SHORT_ATOM);
- *DataLength = ShortAtom->ShortAtomBits.Length;
- return TcgResultSuccess;
- }
- case TcgTokenTypeMediumAtom: {
- MediumAtom = (TCG_SIMPLE_TOKEN_MEDIUM_ATOM*)TcgToken->HdrStart;
- *ByteOrInt = MediumAtom->MediumAtomBits.ByteOrInt;
- *SignOrCont = MediumAtom->MediumAtomBits.SignOrCont;
- *HeaderLength = sizeof(TCG_SIMPLE_TOKEN_MEDIUM_ATOM);
- *DataLength = (MediumAtom->MediumAtomBits.LengthHigh << TCG_MEDIUM_ATOM_LENGTH_HIGH_SHIFT) | MediumAtom->MediumAtomBits.LengthLow;
- return TcgResultSuccess;
- }
- case TcgTokenTypeLongAtom: {
- LongAtom = (TCG_SIMPLE_TOKEN_LONG_ATOM*)TcgToken->HdrStart;
- *ByteOrInt = LongAtom->LongAtomBits.ByteOrInt;
- *SignOrCont = LongAtom->LongAtomBits.SignOrCont;
- *HeaderLength = sizeof(TCG_SIMPLE_TOKEN_LONG_ATOM);
- *DataLength = (LongAtom->LongAtomBits.LengthHigh << TCG_LONG_ATOM_LENGTH_HIGH_SHIFT) |
- (LongAtom->LongAtomBits.LengthMid << TCG_LONG_ATOM_LENGTH_MID_SHIFT) |
- LongAtom->LongAtomBits.LengthLow;
- return TcgResultSuccess;
- }
- default:
- DEBUG ((DEBUG_INFO, "Token Type is not simple atom (%d)\n", TcgToken->Type));
- return (TcgResultFailureInvalidType);
- }
- }
- /**
- Get token specified value.
- @param TcgToken Input token info.
- @param Value return the value.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetTokenUINT64(
- const TCG_TOKEN *TcgToken,
- UINT64 *Value
- )
- {
- UINT32 HdrLength;
- UINT32 DataLength;
- UINT8 ByteOrInt;
- UINT8 IsSigned;
- TCG_SIMPLE_TOKEN_TINY_ATOM* TmpTiny;
- const UINT8* Data;
- UINT32 Index;
- NULL_CHECK(TcgToken);
- NULL_CHECK(Value);
- Index = 0;
- *Value = 0;
- ERROR_CHECK(TcgGetAtomInfo(TcgToken, &HdrLength, &DataLength, &ByteOrInt, &IsSigned));
- if (ByteOrInt != TCG_ATOM_TYPE_INTEGER) {
- DEBUG ((DEBUG_INFO, "Invalid Type, expected integer not byte sequence\n"));
- return TcgResultFailureInvalidType;
- }
- if (IsSigned != 0) {
- DEBUG ((DEBUG_INFO, "Integer is signed, expected unsigned\n"));
- return TcgResultFailureInvalidType;
- }
- // special case for tiny atom
- // Header and Data are in one byte, so extract only the Data bitfield
- if (TcgToken->Type == TcgTokenTypeTinyAtom) {
- TmpTiny = (TCG_SIMPLE_TOKEN_TINY_ATOM*)TcgToken->HdrStart;
- *Value = TmpTiny->TinyAtomBits.Data;
- return TcgResultSuccess;
- }
- if (DataLength > sizeof(UINT64)) {
- DEBUG ((DEBUG_INFO, "Length %d is greater than Size of UINT64\n", DataLength));
- return TcgResultFailureBufferTooSmall;
- }
- // read big-endian integer
- Data = TcgToken->HdrStart + HdrLength;
- for (Index = 0; Index < DataLength; Index++) {
- *Value = LShiftU64(*Value, 8) | Data[Index];
- }
- return TcgResultSuccess;
- }
- /**
- Get token byte sequence.
- @param TcgToken Input token info.
- @param Length Input the length info.
- @retval Return the value data.
- **/
- UINT8*
- EFIAPI
- TcgGetTokenByteSequence(
- const TCG_TOKEN *TcgToken,
- UINT32 *Length
- )
- {
- UINT32 HdrLength;
- UINT8 ByteOrInt;
- UINT8 SignOrCont;
- if (TcgToken == NULL || Length == NULL) {
- return NULL;
- }
- *Length = 0;
- if (TcgGetAtomInfo(TcgToken, &HdrLength, Length, &ByteOrInt, &SignOrCont) != TcgResultSuccess) {
- DEBUG ((DEBUG_INFO, "Failed to get simple token info\n"));
- return NULL;
- }
- if (ByteOrInt != TCG_ATOM_TYPE_BYTE) {
- DEBUG ((DEBUG_INFO, "Invalid Type, expected byte sequence not integer\n"));
- return NULL;
- }
- return (TcgToken->HdrStart + HdrLength);
- }
- /**
- Get next specify value.
- @param ParseStruct Input parse structure.
- @param Value Return value.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextUINT8(
- TCG_PARSE_STRUCT *ParseStruct,
- UINT8 *Value
- )
- {
- UINT64 Value64;
- TCG_TOKEN Tok;
- NULL_CHECK(Value);
- ERROR_CHECK(TcgGetNextToken(ParseStruct, &Tok));
- ERROR_CHECK(TcgGetTokenUINT64(&Tok, &Value64));
- if (Value64 > MAX_UINT8) {
- return TcgResultFailure;
- }
- *Value = (UINT8)Value64;
- return TcgResultSuccess;
- }
- /**
- Get next specify value.
- @param ParseStruct Input parse structure.
- @param Value Return value.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextUINT16(
- TCG_PARSE_STRUCT *ParseStruct,
- UINT16 *Value
- )
- {
- UINT64 Value64;
- TCG_TOKEN Tok;
- NULL_CHECK(Value);
- ERROR_CHECK(TcgGetNextToken(ParseStruct, &Tok));
- ERROR_CHECK(TcgGetTokenUINT64(&Tok, &Value64));
- if (Value64 > MAX_UINT16) {
- return TcgResultFailure;
- }
- *Value = (UINT16)Value64;
- return TcgResultSuccess;
- }
- /**
- Get next specify value.
- @param ParseStruct Input parse structure.
- @param Value Return value.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextUINT32(
- TCG_PARSE_STRUCT *ParseStruct,
- UINT32 *Value
- )
- {
- UINT64 Value64;
- TCG_TOKEN Tok;
- NULL_CHECK(Value);
- ERROR_CHECK(TcgGetNextToken(ParseStruct, &Tok));
- ERROR_CHECK(TcgGetTokenUINT64(&Tok, &Value64));
- if (Value64 > MAX_UINT32) {
- return TcgResultFailure;
- }
- *Value = (UINT32)Value64;
- return TcgResultSuccess;
- }
- /**
- Get next specify value.
- @param ParseStruct Input parse structure.
- @param Value Return value.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextUINT64(
- TCG_PARSE_STRUCT *ParseStruct,
- UINT64 *Value
- )
- {
- TCG_TOKEN Tok;
- ERROR_CHECK(TcgGetNextToken(ParseStruct, &Tok));
- ERROR_CHECK(TcgGetTokenUINT64(&Tok, Value));
- return TcgResultSuccess;
- }
- /**
- Get next specify value.
- @param ParseStruct Input parse structure.
- @param Value Return value.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextBOOLEAN(
- TCG_PARSE_STRUCT *ParseStruct,
- BOOLEAN *Value
- )
- {
- UINT64 Value64;
- TCG_TOKEN Tok;
- NULL_CHECK(Value);
- ERROR_CHECK(TcgGetNextToken(ParseStruct, &Tok));
- ERROR_CHECK(TcgGetTokenUINT64(&Tok, &Value64));
- if (Value64 > 1) {
- return TcgResultFailure;
- }
- *Value = (BOOLEAN)Value64;
- return TcgResultSuccess;
- }
- /**
- Get next tcg uid info.
- @param ParseStruct Input parse structure.
- @param Uid Get the uid info.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextTcgUid(
- TCG_PARSE_STRUCT *ParseStruct,
- TCG_UID *Uid
- )
- {
- TCG_TOKEN Tok;
- UINT32 Length;
- const UINT8* ByteSeq;
- NULL_CHECK(Uid);
- ERROR_CHECK(TcgGetNextToken(ParseStruct, &Tok));
- ByteSeq = TcgGetTokenByteSequence(&Tok, &Length);
- if (Length != sizeof(TCG_UID)) {
- DEBUG ((DEBUG_INFO, "Token Length %u != TCG_UID Size %u\n", Length, (UINT32)sizeof(TCG_UID)));
- return TcgResultFailure;
- }
- ASSERT (ByteSeq != NULL);
- CopyMem(Uid, ByteSeq, sizeof(TCG_UID));
- return TcgResultSuccess;
- }
- /**
- Get next byte sequence.
- @param ParseStruct Input parse structure.
- @param Data return the data.
- @param Length return the length.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextByteSequence(
- TCG_PARSE_STRUCT *ParseStruct,
- const VOID **Data,
- UINT32 *Length
- )
- {
- TCG_TOKEN Tok;
- const UINT8* Bs;
- ERROR_CHECK(TcgGetNextToken(ParseStruct, &Tok));
- Bs = TcgGetTokenByteSequence(&Tok, Length);
- if (Bs == NULL) {
- return TcgResultFailure;
- }
- *Data = Bs;
- return TcgResultSuccess;
- }
- /**
- Get next token Type.
- @param ParseStruct Input parse structure.
- @param Type Input the type need to check.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextTokenType(
- TCG_PARSE_STRUCT *ParseStruct,
- TCG_TOKEN_TYPE Type
- )
- {
- TCG_TOKEN Tok;
- ERROR_CHECK(TcgGetNextToken(ParseStruct, &Tok));
- if (Tok.Type != Type) {
- DEBUG ((DEBUG_INFO, "expected Type %u, got Type %u\n", Type, Tok.Type));
- return TcgResultFailure;
- }
- return TcgResultSuccess;
- }
- /**
- Get next start list.
- @param ParseStruct Input parse structure.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextStartList(
- TCG_PARSE_STRUCT *ParseStruct
- )
- {
- return TcgGetNextTokenType(ParseStruct, TcgTokenTypeStartList);
- }
- /**
- Get next end list.
- @param ParseStruct Input parse structure.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextEndList(
- TCG_PARSE_STRUCT *ParseStruct
- )
- {
- return TcgGetNextTokenType(ParseStruct, TcgTokenTypeEndList);
- }
- /**
- Get next start name.
- @param ParseStruct Input parse structure.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextStartName(
- TCG_PARSE_STRUCT *ParseStruct
- )
- {
- return TcgGetNextTokenType(ParseStruct, TcgTokenTypeStartName);
- }
- /**
- Get next end name.
- @param ParseStruct Input parse structure.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextEndName(
- TCG_PARSE_STRUCT *ParseStruct
- )
- {
- return TcgGetNextTokenType(ParseStruct, TcgTokenTypeEndName);
- }
- /**
- Get next call.
- @param ParseStruct Input parse structure.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextCall(
- TCG_PARSE_STRUCT *ParseStruct
- )
- {
- return TcgGetNextTokenType(ParseStruct, TcgTokenTypeCall);
- }
- /**
- Get next end data.
- @param ParseStruct Input parse structure.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextEndOfData(
- TCG_PARSE_STRUCT *ParseStruct
- )
- {
- return TcgGetNextTokenType(ParseStruct, TcgTokenTypeEndOfData);
- }
- /**
- Get next end of session.
- @param ParseStruct Input parse structure.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextEndOfSession(
- TCG_PARSE_STRUCT *ParseStruct
- )
- {
- return TcgGetNextTokenType(ParseStruct, TcgTokenTypeEndOfSession);
- }
- /**
- Get next start transaction.
- @param ParseStruct Input parse structure.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextStartTransaction(
- TCG_PARSE_STRUCT *ParseStruct
- )
- {
- return TcgGetNextTokenType(ParseStruct, TcgTokenTypeStartTransaction);
- }
- /**
- Get next end transaction.
- @param ParseStruct Input parse structure.
- @retval return the action result.
- **/
- TCG_RESULT
- EFIAPI
- TcgGetNextEndTransaction(
- TCG_PARSE_STRUCT *ParseStruct
- )
- {
- return TcgGetNextTokenType(ParseStruct, TcgTokenTypeEndTransaction);
- }
|