@@ -44,6 +44,19 @@ WOLFTPM2_KEY wolftpm_srk;
4444#endif
4545
4646#if defined(WOLFBOOT_TPM_SEAL ) || defined(WOLFBOOT_TPM_KEYSTORE )
47+ static int wolfBoot_constant_compare (const uint8_t * a , const uint8_t * b ,
48+ uint32_t len )
49+ {
50+ uint32_t i ;
51+ uint8_t diff = 0 ;
52+
53+ for (i = 0 ; i < len ; i ++ ) {
54+ diff |= a [i ] ^ b [i ];
55+ }
56+
57+ return diff ;
58+ }
59+
4760void wolfBoot_print_hexstr (const unsigned char * bin , unsigned long sz ,
4861 unsigned long maxLine )
4962{
@@ -605,6 +618,8 @@ int wolfBoot_store_blob(TPMI_RH_NV_AUTH authHandle, uint32_t nvIndex,
605618 if (authSz > 0 ) {
606619 if (auth == NULL )
607620 return BAD_FUNC_ARG ;
621+ if (authSz > sizeof (nv .handle .auth .buffer ))
622+ return BAD_FUNC_ARG ;
608623 nv .handle .auth .size = authSz ;
609624 memcpy (nv .handle .auth .buffer , auth , authSz );
610625 }
@@ -685,6 +700,8 @@ int wolfBoot_read_blob(uint32_t nvIndex, WOLFTPM2_KEYBLOB* blob,
685700 if (authSz > 0 ) {
686701 if (auth == NULL )
687702 return BAD_FUNC_ARG ;
703+ if (authSz > sizeof (nv .handle .auth .buffer ))
704+ return BAD_FUNC_ARG ;
688705 nv .handle .auth .size = authSz ;
689706 memcpy (nv .handle .auth .buffer , auth , authSz );
690707 }
@@ -696,9 +713,14 @@ int wolfBoot_read_blob(uint32_t nvIndex, WOLFTPM2_KEYBLOB* blob,
696713 (uint8_t * )& blob -> pub .size , & readSz , pos );
697714 if (rc == 0 ) {
698715 pos += readSz ;
699- readSz = blob -> pub .size ;
700- rc = wolfTPM2_NVReadAuth (& wolftpm_dev , & nv , nv .handle .hndl ,
701- pubAreaBuffer , & readSz , pos );
716+ if (blob -> pub .size > sizeof (pubAreaBuffer )) {
717+ rc = BUFFER_E ;
718+ }
719+ else {
720+ readSz = blob -> pub .size ;
721+ rc = wolfTPM2_NVReadAuth (& wolftpm_dev , & nv , nv .handle .hndl ,
722+ pubAreaBuffer , & readSz , pos );
723+ }
702724 }
703725 if (rc == 0 ) {
704726 pos += readSz ;
@@ -712,9 +734,14 @@ int wolfBoot_read_blob(uint32_t nvIndex, WOLFTPM2_KEYBLOB* blob,
712734 }
713735 if (rc == 0 ) {
714736 pos += sizeof (blob -> priv .size );
715- readSz = blob -> priv .size ;
716- rc = wolfTPM2_NVReadAuth (& wolftpm_dev , & nv , nv .handle .hndl ,
717- blob -> priv .buffer , & readSz , pos );
737+ if (blob -> priv .size > sizeof (blob -> priv .buffer )) {
738+ rc = BUFFER_E ;
739+ }
740+ else {
741+ readSz = blob -> priv .size ;
742+ rc = wolfTPM2_NVReadAuth (& wolftpm_dev , & nv , nv .handle .hndl ,
743+ blob -> priv .buffer , & readSz , pos );
744+ }
718745 }
719746 if (rc == 0 ) {
720747 pos += blob -> priv .size ;
@@ -744,6 +771,8 @@ int wolfBoot_delete_blob(TPMI_RH_NV_AUTH authHandle, uint32_t nvIndex,
744771 if (authSz > 0 ) {
745772 if (auth == NULL )
746773 return BAD_FUNC_ARG ;
774+ if (authSz > sizeof (nv .handle .auth .buffer ))
775+ return BAD_FUNC_ARG ;
747776 nv .handle .auth .size = authSz ;
748777 memcpy (nv .handle .auth .buffer , auth , authSz );
749778 }
@@ -925,6 +954,7 @@ int wolfBoot_unseal_blob(const uint8_t* pubkey_hint,
925954 const uint8_t * auth , int authSz )
926955{
927956 int rc , i ;
957+ int secret_capacity ;
928958 WOLFTPM2_SESSION policy_session ;
929959 uint32_t key_type ;
930960 TPM_ALG_ID pcrAlg = WOLFBOOT_TPM_PCR_ALG ;
@@ -949,8 +979,13 @@ int wolfBoot_unseal_blob(const uint8_t* pubkey_hint,
949979 return -1 ;
950980 }
951981
982+ secret_capacity = * secret_sz ;
952983 * secret_sz = 0 ; /* init */
953984
985+ if (secret_capacity < 0 ) {
986+ return BAD_FUNC_ARG ;
987+ }
988+
954989 /* extract pcrMask and populate PCR selection array */
955990 memcpy (& pcrMask , policy , sizeof (pcrMask ));
956991 memset (pcrArray , 0 , sizeof (pcrArray ));
@@ -1069,9 +1104,16 @@ int wolfBoot_unseal_blob(const uint8_t* pubkey_hint,
10691104 rc = TPM2_Unseal (& unsealIn , & unsealOut );
10701105 }
10711106 if (rc == 0 ) {
1072- * secret_sz = unsealOut .outData .size ;
1073- memcpy (secret , unsealOut .outData .buffer , * secret_sz );
1107+ if (unsealOut .outData .size > WOLFBOOT_MAX_SEAL_SZ ||
1108+ (int )unsealOut .outData .size > secret_capacity ) {
1109+ rc = BUFFER_E ;
1110+ }
1111+ else {
1112+ * secret_sz = unsealOut .outData .size ;
1113+ memcpy (secret , unsealOut .outData .buffer , * secret_sz );
1114+ }
10741115 }
1116+ TPM2_ForceZero (& unsealOut , sizeof (unsealOut ));
10751117
10761118 wolfTPM2_UnloadHandle (& wolftpm_dev , & seal_blob -> handle );
10771119 wolfTPM2_UnloadHandle (& wolftpm_dev , & policy_session .handle );
@@ -1486,7 +1528,8 @@ int wolfBoot_check_rot(int key_slot, uint8_t* pubkey_hint)
14861528 if (rc == 0 ) {
14871529 /* verify the hint (hash) matches */
14881530 if (digestSz == WOLFBOOT_SHA_DIGEST_SIZE &&
1489- memcmp (digest , pubkey_hint , WOLFBOOT_SHA_DIGEST_SIZE ) == 0 ) {
1531+ wolfBoot_constant_compare (digest , pubkey_hint ,
1532+ WOLFBOOT_SHA_DIGEST_SIZE ) == 0 ) {
14901533 wolfBoot_printf ("TPM Root of Trust valid (id %d)\n" , key_slot );
14911534 }
14921535 else {
0 commit comments