@@ -4947,6 +4947,79 @@ static void test_TPM2_ASN_DecodeX509Cert_Errors(void)
49474947#endif
49484948}
49494949
4950+ static void test_TPM2_ASN_RsaUnpadPkcsv15 (void )
4951+ {
4952+ #if !defined(WOLFTPM2_NO_WRAPPER ) && !defined(WOLFTPM2_NO_ASN )
4953+ byte blk [64 ];
4954+ byte * p ;
4955+ int sz ;
4956+ int i ;
4957+
4958+ /* Well formed: 00 01 FF*8 00 then 2 data bytes */
4959+ XMEMSET (blk , 0xFF , sizeof (blk ));
4960+ blk [0 ] = 0x00 ; blk [1 ] = 0x01 ; blk [10 ] = 0x00 ;
4961+ blk [11 ] = 0xAA ; blk [12 ] = 0xBB ;
4962+ p = blk ; sz = 13 ;
4963+ AssertIntEQ (TPM2_ASN_RsaUnpadPkcsv15 (& p , & sz ), 0 );
4964+ AssertIntEQ (sz , 2 );
4965+ AssertIntEQ (p [0 ], 0xAA );
4966+ AssertIntEQ (p [1 ], 0xBB );
4967+
4968+ /* Exactly 8 pad bytes is the minimum accepted */
4969+ XMEMSET (blk , 0xFF , sizeof (blk ));
4970+ blk [0 ] = 0x00 ; blk [1 ] = 0x01 ; blk [10 ] = 0x00 ; blk [11 ] = 0x5A ;
4971+ p = blk ; sz = 12 ;
4972+ AssertIntEQ (TPM2_ASN_RsaUnpadPkcsv15 (& p , & sz ), 0 );
4973+ AssertIntEQ (sz , 1 );
4974+
4975+ /* Seven pad bytes must be rejected */
4976+ XMEMSET (blk , 0xFF , sizeof (blk ));
4977+ blk [0 ] = 0x00 ; blk [1 ] = 0x01 ; blk [9 ] = 0x00 ; blk [10 ] = 0x5A ;
4978+ p = blk ; sz = 11 ;
4979+ AssertIntNE (TPM2_ASN_RsaUnpadPkcsv15 (& p , & sz ), 0 );
4980+
4981+ /* Wrong leading byte */
4982+ XMEMSET (blk , 0xFF , sizeof (blk ));
4983+ blk [0 ] = 0x01 ; blk [1 ] = 0x01 ; blk [10 ] = 0x00 ;
4984+ p = blk ; sz = 12 ;
4985+ AssertIntNE (TPM2_ASN_RsaUnpadPkcsv15 (& p , & sz ), 0 );
4986+
4987+ /* Block type 2 must be rejected (this routine is type 1 only) */
4988+ XMEMSET (blk , 0xFF , sizeof (blk ));
4989+ blk [0 ] = 0x00 ; blk [1 ] = 0x02 ; blk [10 ] = 0x00 ;
4990+ p = blk ; sz = 12 ;
4991+ AssertIntNE (TPM2_ASN_RsaUnpadPkcsv15 (& p , & sz ), 0 );
4992+
4993+ /* No separator at all (all 0xFF tail) */
4994+ XMEMSET (blk , 0xFF , sizeof (blk ));
4995+ blk [0 ] = 0x00 ; blk [1 ] = 0x01 ;
4996+ p = blk ; sz = 16 ;
4997+ AssertIntNE (TPM2_ASN_RsaUnpadPkcsv15 (& p , & sz ), 0 );
4998+
4999+ /* Non-zero, non-FF byte where the separator belongs */
5000+ XMEMSET (blk , 0xFF , sizeof (blk ));
5001+ blk [0 ] = 0x00 ; blk [1 ] = 0x01 ; blk [10 ] = 0x7E ;
5002+ p = blk ; sz = 16 ;
5003+ AssertIntNE (TPM2_ASN_RsaUnpadPkcsv15 (& p , & sz ), 0 );
5004+
5005+ /* Too short to hold a block */
5006+ for (i = 0 ; i < 3 ; i ++ ) {
5007+ XMEMSET (blk , 0x00 , sizeof (blk ));
5008+ p = blk ; sz = i ;
5009+ AssertIntNE (TPM2_ASN_RsaUnpadPkcsv15 (& p , & sz ), 0 );
5010+ }
5011+
5012+ /* Separator as the final byte yields an empty payload */
5013+ XMEMSET (blk , 0xFF , sizeof (blk ));
5014+ blk [0 ] = 0x00 ; blk [1 ] = 0x01 ; blk [11 ] = 0x00 ;
5015+ p = blk ; sz = 12 ;
5016+ AssertIntEQ (TPM2_ASN_RsaUnpadPkcsv15 (& p , & sz ), 0 );
5017+ AssertIntEQ (sz , 0 );
5018+
5019+ printf ("Test TPM Wrapper: %-40s Passed\n" , "ASN RsaUnpadPkcsv15:" );
5020+ #endif
5021+ }
5022+
49505023#if !defined(WOLFTPM2_NO_WRAPPER ) && !defined(WOLFTPM2_NO_ASN )
49515024#include <examples/endorsement/trusted_certs_der.h>
49525025#endif
@@ -7237,6 +7310,7 @@ int unit_tests(int argc, char *argv[])
72377310 test_wolfTPM2_CSR ();
72387311 test_wolfTPM2_CryptoDevCb_EccVerifyOversizedRS ();
72397312 test_TPM2_ASN_DecodeX509Cert_Errors ();
7313+ test_TPM2_ASN_RsaUnpadPkcsv15 ();
72407314 test_TPM2_ASN_DecodeX509Cert_Valid ();
72417315 test_TPM2_ASN_DecodeTag_Errors ();
72427316 #if !defined(WOLFTPM2_NO_WOLFCRYPT ) && defined(WOLFTPM2_PEM_DECODE ) && \
0 commit comments