diff options
author | Vadim Bendebury <vbendeb@chromium.org> | 2016-11-22 15:48:50 -0800 |
---|---|---|
committer | Youcheng Syu <youcheng@google.com> | 2017-02-07 12:11:57 +0000 |
commit | 8b054562d3f7ed93096b4a5d24866c231d604c0f (patch) | |
tree | 63ea37ae6fd4a076e1f15959b539d2dfca623ed3 | |
parent | 908e55e651503d266ea4996c0d20a003dc5b76df (diff) | |
download | chrome-ec-8b054562d3f7ed93096b4a5d24866c231d604c0f.tar.gz |
g: update: expose USB PDU verification function
Some upcoming changes will introduce transfer of vendor and extension
commands over the usb updater endpoint.
This patch exposes a function which allows to verify integrity of
received USB PDUs.
BRANCH=none
BUG=chrome-os-partner:60013
TEST=no functional changes, usb_updater still works fine.
Change-Id: I8d9e6746ef0dfbb17bba618410514ca047a59a45
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/414441
Reviewed-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/439091
Reviewed-by: Youcheng Syu <youcheng@google.com>
Commit-Queue: Youcheng Syu <youcheng@google.com>
Tested-by: Youcheng Syu <youcheng@google.com>
-rw-r--r-- | chip/g/upgrade_fw.c | 34 | ||||
-rw-r--r-- | chip/g/upgrade_fw.h | 4 |
2 files changed, 26 insertions, 12 deletions
diff --git a/chip/g/upgrade_fw.c b/chip/g/upgrade_fw.c index 0eed2c51a4..f77d4145e8 100644 --- a/chip/g/upgrade_fw.c +++ b/chip/g/upgrade_fw.c @@ -148,6 +148,27 @@ static uint8_t check_update_chunk(uint32_t block_offset, size_t body_size) return UPGRADE_BAD_ADDR; } +int usb_pdu_valid(struct upgrade_command *cmd_body, size_t cmd_size) +{ + uint8_t sha1_digest[SHA_DIGEST_SIZE]; + size_t body_size = cmd_size - offsetof(struct update_frame_header, + cmd.block_base); + + /* Check if the block was received properly. */ + DCRYPTO_SHA1_hash((uint8_t *)&cmd_body->block_base, + body_size + sizeof(cmd_body->block_base), + sha1_digest); + if (memcmp(sha1_digest, &cmd_body->block_digest, + sizeof(cmd_body->block_digest))) { + CPRINTF("%s:%d sha1 %x not equal received %x\n", + __func__, __LINE__, + *(uint32_t *)sha1_digest, cmd_body->block_digest); + return 0; + } + + return 1; +} + void fw_upgrade_command_handler(void *body, size_t cmd_size, size_t *response_size) @@ -155,7 +176,6 @@ void fw_upgrade_command_handler(void *body, struct upgrade_command *cmd_body = body; void *upgrade_data; uint8_t *error_code = body; /* Cache the address for code clarity. */ - uint8_t sha1_digest[SHA_DIGEST_SIZE]; size_t body_size; uint32_t block_offset; @@ -224,20 +244,10 @@ void fw_upgrade_command_handler(void *body, return; } - /* Check if the block was received properly. */ - DCRYPTO_SHA1_hash((uint8_t *)&cmd_body->block_base, - body_size + sizeof(cmd_body->block_base), - sha1_digest); - block_offset = be32toh(cmd_body->block_base); - if (memcmp(sha1_digest, &cmd_body->block_digest, - sizeof(cmd_body->block_digest))) { + if (!usb_pdu_valid(cmd_body, cmd_size)) { *error_code = UPGRADE_DATA_ERROR; - CPRINTF("%s:%d sha1 %x not equal received %x at offs. 0x%x\n", - __func__, __LINE__, - *(uint32_t *)sha1_digest, cmd_body->block_digest, - block_offset); return; } diff --git a/chip/g/upgrade_fw.h b/chip/g/upgrade_fw.h index cab1f083ca..01e8addbc4 100644 --- a/chip/g/upgrade_fw.h +++ b/chip/g/upgrade_fw.h @@ -122,6 +122,10 @@ void fw_upgrade_command_handler(void *body, /* Used to tell fw upgrade the update ran successfully and is finished */ void fw_upgrade_complete(void); +/* Verify integrity of the PDU received over USB. */ +int usb_pdu_valid(struct upgrade_command *cmd_body, + size_t cmd_size); + /* Various upgrade command return values. */ enum return_value { UPGRADE_SUCCESS = 0, |