@@ -191,7 +191,10 @@ void TPM2_Packet_ParseBytes(TPM2_Packet* packet, byte* buf, int size)
191191 int sizeToCopy = size ;
192192 if (packet -> pos + sizeToCopy > packet -> size )
193193 sizeToCopy = packet -> size - packet -> pos ;
194- XMEMCPY (buf , & packet -> buf [packet -> pos ], sizeToCopy );
194+ /* Guard against negative sizeToCopy (when pos > size) */
195+ if (sizeToCopy > 0 ) {
196+ XMEMCPY (buf , & packet -> buf [packet -> pos ], sizeToCopy );
197+ }
195198 }
196199 packet -> pos += size ;
197200 }
@@ -399,14 +402,32 @@ TPM_ST TPM2_Packet_AppendAuth(TPM2_Packet* packet, TPM2_CTX* ctx, CmdInfo_t* inf
399402
400403void TPM2_Packet_ParseAuth (TPM2_Packet * packet , TPMS_AUTH_RESPONSE * authRsp )
401404{
405+ UINT16 wireSize ;
406+
402407 if (authRsp == NULL )
403408 return ;
404409
405- TPM2_Packet_ParseU16 (packet , & authRsp -> nonce .size );
410+ TPM2_Packet_ParseU16 (packet , & wireSize );
411+ authRsp -> nonce .size = wireSize ;
412+ if (authRsp -> nonce .size > sizeof (authRsp -> nonce .buffer )) {
413+ authRsp -> nonce .size = sizeof (authRsp -> nonce .buffer );
414+ }
406415 TPM2_Packet_ParseBytes (packet , authRsp -> nonce .buffer , authRsp -> nonce .size );
416+ /* Skip any remaining bytes to keep packet position synchronized */
417+ if (wireSize > authRsp -> nonce .size ) {
418+ TPM2_Packet_ParseBytes (packet , NULL , wireSize - authRsp -> nonce .size );
419+ }
407420 TPM2_Packet_ParseU8 (packet , & authRsp -> sessionAttributes );
408- TPM2_Packet_ParseU16 (packet , & authRsp -> hmac .size );
421+ TPM2_Packet_ParseU16 (packet , & wireSize );
422+ authRsp -> hmac .size = wireSize ;
423+ if (authRsp -> hmac .size > sizeof (authRsp -> hmac .buffer )) {
424+ authRsp -> hmac .size = sizeof (authRsp -> hmac .buffer );
425+ }
409426 TPM2_Packet_ParseBytes (packet , authRsp -> hmac .buffer , authRsp -> hmac .size );
427+ /* Skip any remaining bytes to keep packet position synchronized */
428+ if (wireSize > authRsp -> hmac .size ) {
429+ TPM2_Packet_ParseBytes (packet , NULL , wireSize - authRsp -> hmac .size );
430+ }
410431}
411432
412433void TPM2_Packet_AppendPCR (TPM2_Packet * packet , TPML_PCR_SELECTION * pcr )
@@ -552,17 +573,35 @@ void TPM2_Packet_AppendEccPoint(TPM2_Packet* packet, TPMS_ECC_POINT* point)
552573}
553574void TPM2_Packet_ParseEccPoint (TPM2_Packet * packet , TPMS_ECC_POINT * point )
554575{
576+ UINT16 wireSize ;
577+
555578 if (point == NULL ) {
556579#ifdef DEBUG_WOLFTPM
557580 printf ("Error null argument passed to TPM2_Packet_ParseEccPoint()\n" );
558581#endif
559582 return ; /* help out static analysis */
560583 }
561584
562- TPM2_Packet_ParseU16 (packet , & point -> x .size );
585+ TPM2_Packet_ParseU16 (packet , & wireSize );
586+ point -> x .size = wireSize ;
587+ if (point -> x .size > sizeof (point -> x .buffer )) {
588+ point -> x .size = sizeof (point -> x .buffer );
589+ }
563590 TPM2_Packet_ParseBytes (packet , point -> x .buffer , point -> x .size );
564- TPM2_Packet_ParseU16 (packet , & point -> y .size );
591+ /* Skip any remaining bytes to keep packet position synchronized */
592+ if (wireSize > point -> x .size ) {
593+ TPM2_Packet_ParseBytes (packet , NULL , wireSize - point -> x .size );
594+ }
595+ TPM2_Packet_ParseU16 (packet , & wireSize );
596+ point -> y .size = wireSize ;
597+ if (point -> y .size > sizeof (point -> y .buffer )) {
598+ point -> y .size = sizeof (point -> y .buffer );
599+ }
565600 TPM2_Packet_ParseBytes (packet , point -> y .buffer , point -> y .size );
601+ /* Skip any remaining bytes to keep packet position synchronized */
602+ if (wireSize > point -> y .size ) {
603+ TPM2_Packet_ParseBytes (packet , NULL , wireSize - point -> y .size );
604+ }
566605}
567606
568607void TPM2_Packet_AppendPoint (TPM2_Packet * packet , TPM2B_ECC_POINT * point )
@@ -818,6 +857,7 @@ void TPM2_Packet_AppendSignature(TPM2_Packet* packet, TPMT_SIGNATURE* sig)
818857void TPM2_Packet_ParseSignature (TPM2_Packet * packet , TPMT_SIGNATURE * sig )
819858{
820859 int digestSz ;
860+ UINT16 wireSize ;
821861
822862 TPM2_Packet_ParseU16 (packet , & sig -> sigAlg );
823863
@@ -826,21 +866,54 @@ void TPM2_Packet_ParseSignature(TPM2_Packet* packet, TPMT_SIGNATURE* sig)
826866 case TPM_ALG_ECDAA :
827867 TPM2_Packet_ParseU16 (packet , & sig -> signature .ecdsa .hash );
828868
829- TPM2_Packet_ParseU16 (packet , & sig -> signature .ecdsa .signatureR .size );
869+ TPM2_Packet_ParseU16 (packet , & wireSize );
870+ sig -> signature .ecdsa .signatureR .size = wireSize ;
871+ if (sig -> signature .ecdsa .signatureR .size >
872+ sizeof (sig -> signature .ecdsa .signatureR .buffer )) {
873+ sig -> signature .ecdsa .signatureR .size =
874+ sizeof (sig -> signature .ecdsa .signatureR .buffer );
875+ }
830876 TPM2_Packet_ParseBytes (packet , sig -> signature .ecdsa .signatureR .buffer ,
831877 sig -> signature .ecdsa .signatureR .size );
878+ /* Skip any remaining bytes to keep packet position synchronized */
879+ if (wireSize > sig -> signature .ecdsa .signatureR .size ) {
880+ TPM2_Packet_ParseBytes (packet , NULL ,
881+ wireSize - sig -> signature .ecdsa .signatureR .size );
882+ }
832883
833- TPM2_Packet_ParseU16 (packet , & sig -> signature .ecdsa .signatureS .size );
884+ TPM2_Packet_ParseU16 (packet , & wireSize );
885+ sig -> signature .ecdsa .signatureS .size = wireSize ;
886+ if (sig -> signature .ecdsa .signatureS .size >
887+ sizeof (sig -> signature .ecdsa .signatureS .buffer )) {
888+ sig -> signature .ecdsa .signatureS .size =
889+ sizeof (sig -> signature .ecdsa .signatureS .buffer );
890+ }
834891 TPM2_Packet_ParseBytes (packet , sig -> signature .ecdsa .signatureS .buffer ,
835892 sig -> signature .ecdsa .signatureS .size );
893+ /* Skip any remaining bytes to keep packet position synchronized */
894+ if (wireSize > sig -> signature .ecdsa .signatureS .size ) {
895+ TPM2_Packet_ParseBytes (packet , NULL ,
896+ wireSize - sig -> signature .ecdsa .signatureS .size );
897+ }
836898 break ;
837899 case TPM_ALG_RSASSA :
838900 case TPM_ALG_RSAPSS :
839901 TPM2_Packet_ParseU16 (packet , & sig -> signature .rsassa .hash );
840902
841- TPM2_Packet_ParseU16 (packet , & sig -> signature .rsassa .sig .size );
903+ TPM2_Packet_ParseU16 (packet , & wireSize );
904+ sig -> signature .rsassa .sig .size = wireSize ;
905+ if (sig -> signature .rsassa .sig .size >
906+ sizeof (sig -> signature .rsassa .sig .buffer )) {
907+ sig -> signature .rsassa .sig .size =
908+ sizeof (sig -> signature .rsassa .sig .buffer );
909+ }
842910 TPM2_Packet_ParseBytes (packet , sig -> signature .rsassa .sig .buffer ,
843911 sig -> signature .rsassa .sig .size );
912+ /* Skip any remaining bytes to keep packet position synchronized */
913+ if (wireSize > sig -> signature .rsassa .sig .size ) {
914+ TPM2_Packet_ParseBytes (packet , NULL ,
915+ wireSize - sig -> signature .rsassa .sig .size );
916+ }
844917 break ;
845918 case TPM_ALG_HMAC :
846919 TPM2_Packet_ParseU16 (packet , & sig -> signature .hmac .hashAlg );
0 commit comments