|
|
@@ -703,3 +703,39 @@ void bootloader_reset(void)
|
|
|
abort(); /* This function should really not be called from application code */
|
|
|
#endif
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+esp_err_t bootloader_sha256_flash_contents(uint32_t flash_offset, uint32_t len, uint8_t *digest)
|
|
|
+{
|
|
|
+
|
|
|
+ if (digest == NULL) {
|
|
|
+ return ESP_ERR_INVALID_ARG;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Handling firmware images larger than MMU capacity */
|
|
|
+ uint32_t mmu_free_pages_count = bootloader_mmap_get_free_pages();
|
|
|
+ bootloader_sha256_handle_t sha_handle = NULL;
|
|
|
+
|
|
|
+ sha_handle = bootloader_sha256_start();
|
|
|
+ if (sha_handle == NULL) {
|
|
|
+ return ESP_ERR_NO_MEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ while (len > 0) {
|
|
|
+ uint32_t mmu_page_offset = ((flash_offset & MMAP_ALIGNED_MASK) != 0) ? 1 : 0; /* Skip 1st MMU Page if it is already populated */
|
|
|
+ uint32_t partial_image_len = MIN(len, ((mmu_free_pages_count - mmu_page_offset) * SPI_FLASH_MMU_PAGE_SIZE)); /* Read the image that fits in the free MMU pages */
|
|
|
+
|
|
|
+ const void * image = bootloader_mmap(flash_offset, partial_image_len);
|
|
|
+ if (image == NULL) {
|
|
|
+ bootloader_sha256_finish(sha_handle, NULL);
|
|
|
+ return ESP_FAIL;
|
|
|
+ }
|
|
|
+ bootloader_sha256_data(sha_handle, image, partial_image_len);
|
|
|
+ bootloader_munmap(image);
|
|
|
+
|
|
|
+ flash_offset += partial_image_len;
|
|
|
+ len -= partial_image_len;
|
|
|
+ }
|
|
|
+ bootloader_sha256_finish(sha_handle, digest);
|
|
|
+ return ESP_OK;
|
|
|
+}
|