mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-28 02:35:28 +00:00
vboot_hash: check the current hash is for the right region
With the RO region being added to software sync, up to two hashes will be requested during boot. Currently if vboot_hash has a valid hash when the EC gets an EC_VBOOT_HASH_GET host command then it will return that hash. When the EC gets a request for the RO hash after it has calculated the RW hash it returns the RW hash in the response. This change will add a check that the EC not only has a valid hash, but that it is for the correct region. BRANCH=none BUG=none TEST=Try to get the RO and RW hashes from depthcharge and make sure they match the values gotten using ectool Change-Id: I2449c8d79b4a74f4865dd1234fb253bcdac66a31 Signed-off-by: Mary Ruthven <mruthven@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/318861 Reviewed-by: Randall Spangler <rspangler@chromium.org>
This commit is contained in:
@@ -326,12 +326,27 @@ DECLARE_CONSOLE_COMMAND(hash, command_hash,
|
||||
/****************************************************************************/
|
||||
/* Host commands */
|
||||
|
||||
/**
|
||||
* Return the offset of the RO or RW region if the either region is specifically
|
||||
* requested otherwise return the current hash offset.
|
||||
*/
|
||||
static int get_offset(int offset)
|
||||
{
|
||||
if (offset == EC_VBOOT_HASH_OFFSET_RO)
|
||||
return CONFIG_EC_PROTECTED_STORAGE_OFF + CONFIG_RO_STORAGE_OFF;
|
||||
if (offset == EC_VBOOT_HASH_OFFSET_RW)
|
||||
return CONFIG_EC_WRITABLE_STORAGE_OFF + CONFIG_RW_STORAGE_OFF;
|
||||
return data_offset;
|
||||
}
|
||||
|
||||
/* Fill in the response with the current hash status */
|
||||
static void fill_response(struct ec_response_vboot_hash *r)
|
||||
static void fill_response(struct ec_response_vboot_hash *r,
|
||||
int request_offset)
|
||||
{
|
||||
if (in_progress)
|
||||
r->status = EC_VBOOT_HASH_STATUS_BUSY;
|
||||
else if (hash && !want_abort) {
|
||||
else if (get_offset(request_offset) == data_offset && hash &&
|
||||
!want_abort) {
|
||||
r->status = EC_VBOOT_HASH_STATUS_DONE;
|
||||
r->hash_type = EC_VBOOT_HASH_TYPE_SHA256;
|
||||
r->digest_size = SHA256_DIGEST_SIZE;
|
||||
@@ -389,7 +404,7 @@ static int host_command_vboot_hash(struct host_cmd_handler_args *args)
|
||||
|
||||
switch (p->cmd) {
|
||||
case EC_VBOOT_HASH_GET:
|
||||
fill_response(r);
|
||||
fill_response(r, p->offset);
|
||||
args->response_size = sizeof(*r);
|
||||
return EC_RES_SUCCESS;
|
||||
|
||||
@@ -408,7 +423,7 @@ static int host_command_vboot_hash(struct host_cmd_handler_args *args)
|
||||
while (in_progress)
|
||||
usleep(1000);
|
||||
|
||||
fill_response(r);
|
||||
fill_response(r, p->offset);
|
||||
args->response_size = sizeof(*r);
|
||||
return EC_RES_SUCCESS;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user