summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2016-11-22 15:48:50 -0800
committerYoucheng Syu <youcheng@google.com>2017-02-07 12:11:57 +0000
commit8b054562d3f7ed93096b4a5d24866c231d604c0f (patch)
tree63ea37ae6fd4a076e1f15959b539d2dfca623ed3
parent908e55e651503d266ea4996c0d20a003dc5b76df (diff)
downloadchrome-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.c34
-rw-r--r--chip/g/upgrade_fw.h4
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,