4040#endif
4141#endif /* WOLFBOOT_GZIP */
4242
43+ /* Default upper bound on a single FIT subimage's decompressed size.
44+ * The outer wolfBoot signature already authenticates the FIT, but a
45+ * concrete cap defends against a malformed-but-signed FIT scribbling
46+ * across unrelated memory. Override per target via:
47+ * CFLAGS+=-DWOLFBOOT_FIT_MAX_DECOMP=...
48+ */
49+ #ifndef WOLFBOOT_FIT_MAX_DECOMP
50+ #define WOLFBOOT_FIT_MAX_DECOMP (256U * 1024U * 1024U)
51+ #endif
52+
4353uint32_t cpu_to_fdt32 (uint32_t x )
4454{
4555#ifdef BIG_ENDIAN_ORDER
@@ -911,6 +921,9 @@ static int fit_verify_hash(const void *fdt, int img_off,
911921 int hash_off , len = 0 ;
912922 const char * algo = NULL ;
913923 const uint8_t * value = NULL ;
924+ #if defined(WOLFBOOT_HASH_SHA256 ) || defined(WOLFBOOT_HASH_SHA384 )
925+ int did_init = 0 ;
926+ #endif
914927#ifdef WOLFBOOT_HASH_SHA256
915928 wc_Sha256 sha256_ctx ;
916929 uint8_t sha256_digest [WC_SHA256_DIGEST_SIZE ];
@@ -950,14 +963,20 @@ static int fit_verify_hash(const void *fdt, int img_off,
950963 }
951964 if (ret == 0 ) {
952965 ret = wc_InitSha256 (& sha256_ctx );
966+ if (ret == 0 ) {
967+ did_init = 1 ;
968+ }
953969 }
954970 if (ret == 0 ) {
955971 ret = wc_Sha256Update (& sha256_ctx , data , (word32 )data_len );
956972 }
957973 if (ret == 0 ) {
958974 ret = wc_Sha256Final (& sha256_ctx , sha256_digest );
959975 }
960- wc_Sha256Free (& sha256_ctx );
976+ if (did_init ) {
977+ wc_Sha256Free (& sha256_ctx );
978+ did_init = 0 ;
979+ }
961980 if (ret != 0 ) {
962981 wolfBoot_printf ("FIT hash-1 (sha256): wc_Sha256 failed rc=%d\n" ,
963982 ret );
@@ -982,14 +1001,20 @@ static int fit_verify_hash(const void *fdt, int img_off,
9821001 }
9831002 if (ret == 0 ) {
9841003 ret = wc_InitSha384 (& sha384_ctx );
1004+ if (ret == 0 ) {
1005+ did_init = 1 ;
1006+ }
9851007 }
9861008 if (ret == 0 ) {
9871009 ret = wc_Sha384Update (& sha384_ctx , data , (word32 )data_len );
9881010 }
9891011 if (ret == 0 ) {
9901012 ret = wc_Sha384Final (& sha384_ctx , sha384_digest );
9911013 }
992- wc_Sha384Free (& sha384_ctx );
1014+ if (did_init ) {
1015+ wc_Sha384Free (& sha384_ctx );
1016+ did_init = 0 ;
1017+ }
9931018 if (ret != 0 ) {
9941019 wolfBoot_printf ("FIT hash-1 (sha384): wc_Sha384 failed rc=%d\n" ,
9951020 ret );
@@ -1060,6 +1085,14 @@ void* fit_load_image_ex(void* fdt, const char* image, int* lenp,
10601085 return NULL ;
10611086#endif
10621087 }
1088+ else if (comp != NULL && complen > 0
1089+ && strcmp (comp , "none" ) != 0 ) {
1090+ /* Unknown compression scheme; fail closed rather than
1091+ * silently memcpy compressed bytes as raw. */
1092+ wolfBoot_printf ("FIT: subimage '%s' has unsupported "
1093+ "compression=\"%s\"\n" , image , comp );
1094+ return NULL ;
1095+ }
10631096 else {
10641097 wolfBoot_printf ("Loading Image %s: %p -> %p (%d bytes)\n" ,
10651098 image , data , load , len );
@@ -1093,7 +1126,7 @@ void* fit_load_image_ex(void* fdt, const char* image, int* lenp,
10931126
10941127void * fit_load_image (void * fdt , const char * image , int * lenp )
10951128{
1096- return fit_load_image_ex (fdt , image , lenp , 0xFFFFFFFFU );
1129+ return fit_load_image_ex (fdt , image , lenp , WOLFBOOT_FIT_MAX_DECOMP );
10971130}
10981131
10991132#endif /* (MMU || WOLFBOOT_FDT) && !BUILD_LOADER_STAGE1 */
0 commit comments