@@ -52,6 +52,32 @@ static void reset_mock_stats(void);
5252static void prepare_flash (void );
5353static void cleanup_flash (void );
5454
55+ #ifdef CUSTOM_ENCRYPT_KEY
56+ int wolfBoot_get_encrypt_key (uint8_t * k , uint8_t * nonce )
57+ {
58+ int i ;
59+ for (i = 0 ; i < ENCRYPT_KEY_SIZE ; i ++ ) {
60+ k [i ] = (uint8_t )(i + 1 );
61+ }
62+ for (i = 0 ; i < ENCRYPT_NONCE_SIZE ; i ++ ) {
63+ nonce [i ] = (uint8_t )(0xA5 + i );
64+ }
65+ return 0 ;
66+ }
67+
68+ int wolfBoot_set_encrypt_key (const uint8_t * key , const uint8_t * nonce )
69+ {
70+ (void )key ;
71+ (void )nonce ;
72+ return 0 ;
73+ }
74+
75+ int wolfBoot_erase_encrypt_key (void )
76+ {
77+ return 0 ;
78+ }
79+ #endif
80+
5581START_TEST (test_boot_success_sets_state )
5682{
5783 uint8_t state = 0 ;
@@ -90,6 +116,7 @@ static void reset_mock_stats(void)
90116{
91117 wolfBoot_staged_ok = 0 ;
92118 wolfBoot_panicked = 0 ;
119+ ext_flash_reset_lock ();
93120}
94121
95122
@@ -198,6 +225,121 @@ static int add_payload(uint8_t part, uint32_t version, uint32_t size)
198225
199226}
200227
228+ #ifdef EXT_ENCRYPTED
229+ static int build_image_buffer (uint8_t part , uint32_t version , uint32_t size ,
230+ uint8_t * buf , uint32_t buf_sz )
231+ {
232+ uint32_t word ;
233+ uint16_t word16 ;
234+ uint32_t total = size + IMAGE_HEADER_SIZE ;
235+ int i ;
236+ int ret ;
237+ wc_Sha256 sha ;
238+ uint8_t digest [SHA256_DIGEST_SIZE ];
239+
240+ if (buf_sz < total )
241+ return -1 ;
242+
243+ memset (buf , 0xFF , buf_sz );
244+
245+ ret = wc_InitSha256_ex (& sha , NULL , INVALID_DEVID );
246+ if (ret != 0 )
247+ return ret ;
248+
249+ memcpy (buf , "WOLF" , 4 );
250+ memcpy (buf + 4 , & size , 4 );
251+
252+ word = 4 << 16 | HDR_VERSION ;
253+ memcpy (buf + 8 , & word , 4 );
254+ memcpy (buf + 12 , & version , 4 );
255+
256+ word = 2 << 16 | HDR_IMG_TYPE ;
257+ memcpy (buf + 16 , & word , 4 );
258+ word16 = HDR_IMG_TYPE_AUTH_NONE | HDR_IMG_TYPE_APP ;
259+ memcpy (buf + 20 , & word16 , 2 );
260+
261+ ret = wc_Sha256Update (& sha , buf , DIGEST_TLV_OFF_IN_HDR );
262+ if (ret != 0 )
263+ return ret ;
264+
265+ srandom (part );
266+ for (i = IMAGE_HEADER_SIZE ; i < (int )total ; i += 4 ) {
267+ uint32_t rnd = (random () << 16 ) | random ();
268+ memcpy (buf + i , & rnd , 4 );
269+ }
270+ for (i = IMAGE_HEADER_SIZE ; i < (int )total ; i += WOLFBOOT_SHA_BLOCK_SIZE ) {
271+ int len = WOLFBOOT_SHA_BLOCK_SIZE ;
272+ if ((int )total - i < len )
273+ len = (int )total - i ;
274+ ret = wc_Sha256Update (& sha , buf + i , len );
275+ if (ret != 0 )
276+ return ret ;
277+ }
278+
279+ ret = wc_Sha256Final (& sha , digest );
280+ if (ret != 0 )
281+ return ret ;
282+ wc_Sha256Free (& sha );
283+
284+ word = SHA256_DIGEST_SIZE << 16 | HDR_SHA256 ;
285+ memcpy (buf + DIGEST_TLV_OFF_IN_HDR , & word , 4 );
286+ memcpy (buf + DIGEST_TLV_OFF_IN_HDR + 4 , digest , SHA256_DIGEST_SIZE );
287+
288+ return 0 ;
289+ }
290+
291+ static int add_payload_encrypted (uint8_t part , uint32_t version , uint32_t size ,
292+ int use_fallback_iv )
293+ {
294+ uint32_t total = size + IMAGE_HEADER_SIZE ;
295+ uint8_t * buf = NULL ;
296+ uintptr_t base = (uintptr_t )WOLFBOOT_PARTITION_UPDATE_ADDRESS ;
297+ int ret ;
298+ int prev = 0 ;
299+
300+ if (part == PART_BOOT )
301+ base = (uintptr_t )WOLFBOOT_PARTITION_BOOT_ADDRESS ;
302+ else if (part == PART_UPDATE )
303+ base = (uintptr_t )WOLFBOOT_PARTITION_UPDATE_ADDRESS ;
304+ else
305+ return -1 ;
306+
307+ buf = malloc (total );
308+ if (!buf )
309+ return -1 ;
310+
311+ ret = build_image_buffer (part , version , size , buf , total );
312+ if (ret != 0 ) {
313+ free (buf );
314+ return ret ;
315+ }
316+
317+ if (use_fallback_iv )
318+ prev = wolfBoot_enable_fallback_iv (1 );
319+
320+ ext_flash_unlock ();
321+ {
322+ uint32_t off = 0 ;
323+ while (off < total ) {
324+ uint32_t chunk = total - off ;
325+ if (chunk > WOLFBOOT_SECTOR_SIZE )
326+ chunk = WOLFBOOT_SECTOR_SIZE ;
327+ ret = ext_flash_encrypt_write (base + off , buf + off , chunk );
328+ if (ret != 0 )
329+ break ;
330+ off += chunk ;
331+ }
332+ }
333+ ext_flash_lock ();
334+
335+ if (use_fallback_iv )
336+ wolfBoot_enable_fallback_iv (prev );
337+
338+ free (buf );
339+ return ret ;
340+ }
341+ #endif
342+
201343START_TEST (test_empty_panic )
202344{
203345 reset_mock_stats ();
@@ -210,6 +352,31 @@ START_TEST (test_empty_panic)
210352}
211353END_TEST
212354
355+ #ifdef EXT_ENCRYPTED
356+ START_TEST (test_fallback_image_verification_rejects_corruption )
357+ {
358+ int ret ;
359+ uint8_t bad = 0x00 ;
360+
361+ reset_mock_stats ();
362+ prepare_flash ();
363+
364+ add_payload (PART_BOOT , 1 , TEST_SIZE_SMALL );
365+ ret = add_payload_encrypted (PART_UPDATE , 2 , TEST_SIZE_SMALL , 1 );
366+ ck_assert_int_eq (ret , 0 );
367+
368+ ext_flash_unlock ();
369+ ext_flash_write ((uintptr_t )WOLFBOOT_PARTITION_UPDATE_ADDRESS +
370+ IMAGE_HEADER_SIZE + 16 , & bad , 1 );
371+ ext_flash_lock ();
372+
373+ ret = wolfBoot_update (1 );
374+ ck_assert_int_eq (ret , -1 );
375+
376+ cleanup_flash ();
377+ }
378+ END_TEST
379+ #endif
213380
214381START_TEST (test_sunnyday_noupdate )
215382{
@@ -498,6 +665,9 @@ Suite *wolfboot_suite(void)
498665 Suite * s = suite_create ("wolfboot" );
499666
500667 /* Test cases */
668+ #ifdef UNIT_TEST_FALLBACK_ONLY
669+ TCase * fallback_verify = tcase_create ("Fallback verify" );
670+ #else
501671 TCase * empty_panic = tcase_create ("Empty partition panic test" );
502672 TCase * sunnyday_noupdate =
503673 tcase_create ("Sunny day test with no update available" );
@@ -521,9 +691,17 @@ Suite *wolfboot_suite(void)
521691 TCase * swap_resume = tcase_create ("Swap resume noop" );
522692 TCase * diffbase_version = tcase_create ("Diffbase version lookup" );
523693 TCase * boot_success = tcase_create ("Boot success state" );
694+ #ifdef EXT_ENCRYPTED
695+ TCase * fallback_verify = tcase_create ("Fallback verify" );
696+ #endif
697+ #endif
524698
525699
526-
700+ #ifdef UNIT_TEST_FALLBACK_ONLY
701+ tcase_add_test (fallback_verify , test_fallback_image_verification_rejects_corruption );
702+ suite_add_tcase (s , fallback_verify );
703+ return s ;
704+ #else
527705 tcase_add_test (empty_panic , test_empty_panic );
528706 tcase_add_test (sunnyday_noupdate , test_sunnyday_noupdate );
529707 tcase_add_test (forward_update_samesize , test_forward_update_samesize );
@@ -541,8 +719,9 @@ Suite *wolfboot_suite(void)
541719 tcase_add_test (swap_resume , test_swap_resume_noop );
542720 tcase_add_test (diffbase_version , test_diffbase_version_reads );
543721 tcase_add_test (boot_success , test_boot_success_sets_state );
544-
545-
722+ #ifdef EXT_ENCRYPTED
723+ tcase_add_test (fallback_verify , test_fallback_image_verification_rejects_corruption );
724+ #endif
546725
547726 suite_add_tcase (s , empty_panic );
548727 suite_add_tcase (s , sunnyday_noupdate );
@@ -561,6 +740,10 @@ Suite *wolfboot_suite(void)
561740 suite_add_tcase (s , swap_resume );
562741 suite_add_tcase (s , diffbase_version );
563742 suite_add_tcase (s , boot_success );
743+ #ifdef EXT_ENCRYPTED
744+ suite_add_tcase (s , fallback_verify );
745+ #endif
746+ #endif
564747
565748
566749
0 commit comments