diff options
author | Nicolas Boichat <drinkcat@chromium.org> | 2017-08-16 15:23:55 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-09-15 03:08:26 -0700 |
commit | 1fe1fbac9fb024e872c688730ed0387a40f6fae9 (patch) | |
tree | f9568f2ed3ca2791dae226dbba1489d439223b2e /common/update_fw.c | |
parent | 94279fc38fae533e86425102082e0c681d98d259 (diff) | |
download | chrome-ec-1fe1fbac9fb024e872c688730ed0387a40f6fae9.tar.gz |
update_fw: Validate touchpad FW hashes before updating
Make use of the generated touchpad firmware hashes to validate
the blocks before writing them to the touchpad.
BRANCH=none
BUG=b:63993173
TEST=make TOUCHPAD_FW=SA459C-1211_ForGoogleHammer_3.0.bin \
BOARD=hammer -j
TEST=./usb_updater2 -p SA459C-1211_ForGoogleHammer_3.0.bin works
TEST=./usb_updater2 -p SA459C-1211_ForGoogleHammer_4.0.bin fails
Change-Id: If5d2be57b63e16ee81aa9acaf840c5084f9b92de
Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/616371
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'common/update_fw.c')
-rw-r--r-- | common/update_fw.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/common/update_fw.c b/common/update_fw.c index b7128583fe..3d331472dc 100644 --- a/common/update_fw.c +++ b/common/update_fw.c @@ -121,20 +121,32 @@ static void new_chunk_written(uint32_t block_offset) static int contents_allowed(uint32_t block_offset, size_t body_size, void *update_data) { -#ifdef CONFIG_TOUCHPAD_VIRTUAL_OFF +#if defined(CONFIG_TOUCHPAD_VIRTUAL_OFF) && defined(CONFIG_TOUCHPAD_HASH_FW) if (is_touchpad_block(block_offset, body_size)) { struct sha256_ctx ctx; uint8_t *tmp; + uint32_t fw_offset = block_offset - CONFIG_TOUCHPAD_VIRTUAL_OFF; + unsigned int chunk = fw_offset / CONFIG_UPDATE_PDU_SIZE; + int good = 0; + + if (chunk >= CONFIG_TOUCHPAD_FW_CHUNKS || + (fw_offset % CONFIG_UPDATE_PDU_SIZE) != 0) { + CPRINTF("%s: TP invalid offset %08x\n", + __func__, fw_offset); + return 0; + } SHA256_init(&ctx); SHA256_update(&ctx, update_data, body_size); tmp = SHA256_final(&ctx); - /* TODO(b:63993173): Actually validate the SHA. */ - CPRINTF("%s: SHA %08x %02x..%02x\n", __func__, - block_offset - CONFIG_TOUCHPAD_VIRTUAL_OFF, - tmp[0], tmp[31]); - return 1; + good = !memcmp(tmp, touchpad_fw_hashes[chunk], + SHA256_DIGEST_SIZE); + + CPRINTF("%s: TP %08x %02x..%02x (%s)\n", __func__, + fw_offset, tmp[0], tmp[31], good ? "GOOD" : "BAD"); + + return good; } #endif return 1; |