@@ -1230,14 +1230,41 @@ static int wolfRNG_GetSeedCB(OS_Seed* os, uint8_t* seed, uint32_t sz)
12301230
12311231
12321232/* API's that are callable from non-secure code */
1233+
1234+ /* Validate that a buffer supplied by the non-secure caller lives in the
1235+ * non-secure world before the secure side dereferences it. Without this check a
1236+ * non-secure caller could pass a pointer into Secure SRAM and turn these veneers
1237+ * into a confused-deputy write primitive against Secure memory. The check
1238+ * verifies only the Secure/Non-secure attribution (CMSE_NONSECURE); the MPU
1239+ * read/write permission bits are deliberately not required, as they read back as
1240+ * 0 when the NS MPU is disabled (NO_MPU) and do not constrain Secure accesses to
1241+ * NS memory anyway. Outside of a CMSE secure build there is no security
1242+ * boundary, so the checks collapse to a simple non-NULL pass-through. */
1243+ #if defined(__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3U )
1244+ #include <arm_cmse.h>
1245+ #define WOLFBOOT_TPM_NS_RW (p , sz ) \
1246+ cmse_check_address_range((void*)(p), (size_t)(sz), CMSE_NONSECURE)
1247+ #define WOLFBOOT_TPM_NS_R (p , sz ) \
1248+ cmse_check_address_range((void*)(p), (size_t)(sz), CMSE_NONSECURE)
1249+ #else
1250+ #define WOLFBOOT_TPM_NS_RW (p , sz ) ((void*)(p))
1251+ #define WOLFBOOT_TPM_NS_R (p , sz ) ((void*)(p))
1252+ #endif
1253+
12331254int CSME_NSE_API wolfBoot_tpm2_caps (WOLFTPM2_CAPS * caps )
12341255{
1256+ if (WOLFBOOT_TPM_NS_RW (caps , sizeof (* caps )) == NULL ) {
1257+ return BAD_FUNC_ARG ;
1258+ }
12351259 memset (caps , 0 , sizeof (* caps ));
12361260 return wolfTPM2_GetCapabilities (& wolftpm_dev , caps );
12371261}
12381262
12391263int CSME_NSE_API wolfBoot_tpm2_get_handles (TPM_HANDLE handle , TPML_HANDLE * handles )
12401264{
1265+ if (WOLFBOOT_TPM_NS_RW (handles , sizeof (* handles )) == NULL ) {
1266+ return BAD_FUNC_ARG ;
1267+ }
12411268 memset (handles , 0 , sizeof (* handles ));
12421269 return wolfTPM2_GetHandles (handle , handles );
12431270}
@@ -1249,6 +1276,9 @@ const char* CSME_NSE_API wolfBoot_tpm2_get_alg_name(TPM_ALG_ID alg,
12491276 if (name == NULL || name_sz <= 0 ) {
12501277 return NULL ;
12511278 }
1279+ if (WOLFBOOT_TPM_NS_RW (name , name_sz ) == NULL ) {
1280+ return NULL ;
1281+ }
12521282 s_name = TPM2_GetAlgName (alg );
12531283 if (s_name != NULL && name != NULL && name_sz > 0 ) {
12541284 strncpy (name , s_name , name_sz - 1 );
@@ -1267,6 +1297,9 @@ const char* CSME_NSE_API wolfBoot_tpm2_get_rc_string(int rc, char* error, int er
12671297 if (error == NULL || error_sz <= 0 ) {
12681298 return NULL ;
12691299 }
1300+ if (WOLFBOOT_TPM_NS_RW (error , error_sz ) == NULL ) {
1301+ return NULL ;
1302+ }
12701303 s_error = TPM2_GetRCString (rc );
12711304 if (s_error != NULL && error != NULL && error_sz > 0 ) {
12721305 strncpy (error , s_error , error_sz - 1 );
@@ -1281,17 +1314,32 @@ const char* CSME_NSE_API wolfBoot_tpm2_get_rc_string(int rc, char* error, int er
12811314
12821315int CSME_NSE_API wolfBoot_tpm2_get_capability (GetCapability_In * in , GetCapability_Out * out )
12831316{
1317+ if (WOLFBOOT_TPM_NS_R (in , sizeof (* in )) == NULL ||
1318+ WOLFBOOT_TPM_NS_RW (out , sizeof (* out )) == NULL ) {
1319+ return BAD_FUNC_ARG ;
1320+ }
12841321 return (int )TPM2_GetCapability (in , out );
12851322}
12861323
12871324int CSME_NSE_API wolfBoot_tpm2_read_pcr (uint8_t pcrIndex , uint8_t * digest , int * digestSz )
12881325{
1326+ if (WOLFBOOT_TPM_NS_RW (digest ,
1327+ TPM2_GetHashDigestSize (WOLFBOOT_TPM_PCR_ALG )) == NULL ||
1328+ WOLFBOOT_TPM_NS_RW (digestSz , sizeof (* digestSz )) == NULL ) {
1329+ return BAD_FUNC_ARG ;
1330+ }
12891331 return wolfTPM2_ReadPCR (& wolftpm_dev , pcrIndex , WOLFBOOT_TPM_PCR_ALG ,
12901332 digest , digestSz );
12911333}
12921334
12931335int CSME_NSE_API wolfBoot_tpm2_read_cert (uint32_t handle , uint8_t * cert , uint32_t * certSz )
12941336{
1337+ if (WOLFBOOT_TPM_NS_RW (certSz , sizeof (* certSz )) == NULL ) {
1338+ return BAD_FUNC_ARG ;
1339+ }
1340+ if (WOLFBOOT_TPM_NS_RW (cert , * certSz ) == NULL ) {
1341+ return BAD_FUNC_ARG ;
1342+ }
12951343 wolfTPM2_SetAuthPassword (& wolftpm_dev , 0 , NULL );
12961344 return wolfTPM2_NVReadCert (& wolftpm_dev , handle , cert , certSz );
12971345}
@@ -1304,6 +1352,13 @@ int CSME_NSE_API wolfBoot_tpm2_get_aik(WOLFTPM2_KEY* aik,
13041352 if (aik == NULL ) {
13051353 return BAD_FUNC_ARG ;
13061354 }
1355+ if (WOLFBOOT_TPM_NS_RW (aik , sizeof (* aik )) == NULL ) {
1356+ return BAD_FUNC_ARG ;
1357+ }
1358+ if (masterPassword != NULL &&
1359+ WOLFBOOT_TPM_NS_R (masterPassword , masterPasswordSz ) == NULL ) {
1360+ return BAD_FUNC_ARG ;
1361+ }
13071362
13081363 /* Load existing AIK and set auth */
13091364 rc = wolfTPM2_ReadPublicKey (& wolftpm_dev , aik , TPM2_IAK_KEY_HANDLE );
@@ -1330,6 +1385,10 @@ int CSME_NSE_API wolfBoot_tpm2_get_timestamp(WOLFTPM2_KEY* aik, GetTime_Out* get
13301385 if (aik == NULL || getTime == NULL ) {
13311386 return BAD_FUNC_ARG ;
13321387 }
1388+ if (WOLFBOOT_TPM_NS_RW (aik , sizeof (* aik )) == NULL ||
1389+ WOLFBOOT_TPM_NS_RW (getTime , sizeof (* getTime )) == NULL ) {
1390+ return BAD_FUNC_ARG ;
1391+ }
13331392
13341393 memset (getTime , 0 , sizeof (* getTime ));
13351394 memset (& eh_handle , 0 , sizeof (eh_handle ));
@@ -1358,6 +1417,10 @@ int CSME_NSE_API wolfBoot_tpm2_get_timestamp(WOLFTPM2_KEY* aik, GetTime_Out* get
13581417
13591418int CSME_NSE_API wolfBoot_tpm2_parse_attest (const TPM2B_ATTEST * in , TPMS_ATTEST * out )
13601419{
1420+ if (WOLFBOOT_TPM_NS_R (in , sizeof (* in )) == NULL ||
1421+ WOLFBOOT_TPM_NS_RW (out , sizeof (* out )) == NULL ) {
1422+ return BAD_FUNC_ARG ;
1423+ }
13611424 return TPM2_ParseAttest (in , out );
13621425}
13631426
@@ -1372,6 +1435,11 @@ int CSME_NSE_API wolfBoot_tpm2_quote(WOLFTPM2_KEY* aik,
13721435 quoteResult == NULL ) {
13731436 return BAD_FUNC_ARG ;
13741437 }
1438+ if (WOLFBOOT_TPM_NS_RW (aik , sizeof (* aik )) == NULL ||
1439+ WOLFBOOT_TPM_NS_R (pcrArray , pcrArraySz ) == NULL ||
1440+ WOLFBOOT_TPM_NS_RW (quoteResult , sizeof (* quoteResult )) == NULL ) {
1441+ return BAD_FUNC_ARG ;
1442+ }
13751443
13761444 /* set auth for using the AIK */
13771445 wolfTPM2_SetAuthHandle (& wolftpm_dev , 0 , & aik -> handle );
0 commit comments