summaryrefslogtreecommitdiff
path: root/common/update_fw.c
diff options
context:
space:
mode:
authorNicolas Boichat <drinkcat@chromium.org>2017-08-16 15:23:55 +0800
committerchrome-bot <chrome-bot@chromium.org>2017-09-15 03:08:26 -0700
commit1fe1fbac9fb024e872c688730ed0387a40f6fae9 (patch)
treef9568f2ed3ca2791dae226dbba1489d439223b2e /common/update_fw.c
parent94279fc38fae533e86425102082e0c681d98d259 (diff)
downloadchrome-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.c24
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;