secure boot: Functional partition table & app signature verification

This commit is contained in:
Angus Gratton
2016-11-07 15:45:57 +11:00
parent fe66dd85f0
commit e459f803da
14 changed files with 116 additions and 79 deletions
@@ -38,7 +38,7 @@ const void *bootloader_mmap(uint32_t src_addr, uint32_t size)
return result;
}
void bootloader_unmap(const void *mapping)
void bootloader_munmap(const void *mapping)
{
if(mapping && map) {
spi_flash_munmap(map);
@@ -68,7 +68,7 @@ const void *bootloader_mmap(uint32_t src_addr, uint32_t size)
}
uint32_t src_addr_aligned = src_addr & 0xffff0000;
uint32_t count = (size + 0xffff) / 0x10000;
uint32_t count = (size + (src_addr - src_addr_aligned) + 0xffff) / 0x10000;
Cache_Read_Disable(0);
Cache_Flush(0);
ESP_LOGD(TAG, "mmu set paddr=%08x count=%d", src_addr_aligned, count );
@@ -80,7 +80,7 @@ const void *bootloader_mmap(uint32_t src_addr, uint32_t size)
return (void *)(0x3f400000 + (src_addr - src_addr_aligned));
}
void bootloader_unmap(const void *mapping)
void bootloader_munmap(const void *mapping)
{
if (mapped) {
/* Full MMU reset */
@@ -70,8 +70,8 @@ esp_err_t esp_image_load_segment_header(uint8_t index, uint32_t src_addr, const
ESP_LOGE(TAG, "invalid segment length 0x%x", segment_header->data_len);
err = ESP_ERR_IMAGE_INVALID;
}
ESP_LOGV(TAG, "segment data length 0x%x", segment_header->data_len);
next_addr += sizeof(esp_image_segment_header_t);
ESP_LOGV(TAG, "segment data length 0x%x data starts 0x%x", segment_header->data_len, next_addr);
*segment_data_offset = next_addr;
next_addr += segment_header->data_len;
}
@@ -124,7 +124,7 @@ esp_err_t esp_image_basic_verify(uint32_t src_addr, uint32_t *p_length)
for(int i = 0; i < segment_header.data_len; i++) {
checksum ^= segment_data[i];
}
bootloader_unmap(segment_data);
bootloader_munmap(segment_data);
}
/* End of image, verify checksum */
@@ -90,7 +90,7 @@ static bool secure_boot_generate(uint32_t image_len){
for (int i = 0; i < image_len; i+= HASH_BLOCK_SIZE) {
ets_secure_boot_hash(image + i/sizeof(void *));
}
bootloader_unmap(image);
bootloader_munmap(image);
ets_secure_boot_obtain();
ets_secure_boot_rd_abstract(buf);
@@ -43,9 +43,10 @@ extern const uint8_t signature_verification_key_end[] asm("_binary_signature_ver
esp_err_t esp_secure_boot_verify_signature(uint32_t src_addr, uint32_t length)
{
sha_context sha;
uint8_t digest[64];
uint8_t digest[32];
ptrdiff_t keylen;
const uint8_t *data;
const uint8_t *data, *digest_data;
uint32_t digest_len, chunk_len;
const signature_block_t *sigblock;
bool is_valid;
@@ -68,16 +69,23 @@ esp_err_t esp_secure_boot_verify_signature(uint32_t src_addr, uint32_t length)
/* Use ROM SHA functions directly */
ets_sha_enable();
ets_sha_init(&sha);
ets_sha_update(&sha, SHA2_512, data, length);
ets_sha_finish(&sha, SHA2_512, digest);
digest_len = length * 8;
digest_data = data;
while (digest_len > 0) {
uint32_t chunk_len = (digest_len > 64) ? 64 : digest_len;
ets_sha_update(&sha, SHA2_256, digest_data, chunk_len);
digest_len -= chunk_len;
digest_data += chunk_len / 8;
}
ets_sha_finish(&sha, SHA2_256, digest);
ets_sha_disable();
#else
/* Use thread-safe esp-idf SHA layer */
esp_sha512_init(&sha);
esp_sha512_start(&sha, false);
esp_sha512_update(&sha, data, length);
esp_sha512_finish(&sha, digest);
esp_sha512_free(&sha);
esp_sha256_init(&sha);
esp_sha256_start(&sha, false);
esp_sha256_update(&sha, data, length);
esp_sha256_finish(&sha, digest);
esp_sha256_free(&sha);
#endif
keylen = signature_verification_key_end - signature_verification_key_start;
@@ -90,10 +98,10 @@ esp_err_t esp_secure_boot_verify_signature(uint32_t src_addr, uint32_t length)
digest, sizeof(digest), sigblock->signature,
uECC_secp256r1());
bootloader_unmap(data);
bootloader_munmap(data);
return is_valid ? ESP_OK : ESP_ERR_IMAGE_INVALID;
unmap_and_fail:
bootloader_unmap(data);
bootloader_munmap(data);
return ESP_FAIL;
}