summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--futility/futility.h3
-rw-r--r--futility/misc.c25
-rw-r--r--futility/updater.c15
-rwxr-xr-xtests/futility/test_update.sh18
4 files changed, 48 insertions, 13 deletions
diff --git a/futility/futility.h b/futility/futility.h
index f0635750..f5f6877e 100644
--- a/futility/futility.h
+++ b/futility/futility.h
@@ -108,6 +108,9 @@ int futil_looks_like_gbb(GoogleBinaryBlockHeader *gbb, uint32_t len);
int futil_valid_gbb_header(GoogleBinaryBlockHeader *gbb, uint32_t len,
uint32_t *maxlen);
+/* Sets the HWID string field inside a GBB header. */
+int futil_set_gbb_hwid(struct vb2_gbb_header *gbb, const char *hwid);
+
/* For GBB v1.2 and later, update the hwid_digest */
void update_hwid_digest(GoogleBinaryBlockHeader *gbb);
diff --git a/futility/misc.c b/futility/misc.c
index 703033c5..af291a49 100644
--- a/futility/misc.c
+++ b/futility/misc.c
@@ -4,6 +4,7 @@
* found in the LICENSE file.
*/
+#include <assert.h>
#include <errno.h>
#ifndef HAVE_MACOS
#include <linux/fs.h> /* For BLKGETSIZE64 */
@@ -166,6 +167,7 @@ int print_hwid_digest(GoogleBinaryBlockHeader *gbb,
return is_valid;
}
+/* Deprecated. Use futil_set_gbb_hwid in future. */
/* For GBB v1.2 and later, update the hwid_digest field. */
void update_hwid_digest(GoogleBinaryBlockHeader *gbb)
{
@@ -181,6 +183,29 @@ void update_hwid_digest(GoogleBinaryBlockHeader *gbb)
gbb->hwid_digest, sizeof(gbb->hwid_digest));
}
+/* Sets the HWID string field inside a GBB header. */
+int futil_set_gbb_hwid(struct vb2_gbb_header *gbb, const char *hwid)
+{
+ uint8_t *to = (uint8_t *)gbb + gbb->hwid_offset;
+ size_t len;
+
+ assert(hwid);
+ len = strlen(hwid);
+ if (len >= gbb->hwid_size)
+ return -1;
+
+ /* Zero whole area so we won't have garbage after NUL. */
+ memset(to, 0, gbb->hwid_size);
+ memcpy(to, hwid, len);
+
+ /* major_version starts from 1 and digest must be updated since v1.2. */
+ if (gbb->major_version == 1 && gbb->minor_version < 2)
+ return 0;
+
+ return vb2_digest_buffer(to, len, VB2_HASH_SHA256, gbb->hwid_digest,
+ sizeof(gbb->hwid_digest));
+}
+
/*
* TODO: All sorts of race conditions likely here, and everywhere this is used.
* Do we care? If so, fix it.
diff --git a/futility/updater.c b/futility/updater.c
index d16fe38a..d1352ef1 100644
--- a/futility/updater.c
+++ b/futility/updater.c
@@ -972,8 +972,6 @@ static int preserve_gbb(const struct firmware_image *image_from,
struct firmware_image *image_to,
int preserve_flags)
{
- int len;
- uint8_t *hwid_to, *hwid_from;
const struct vb2_gbb_header *gbb_from;
struct vb2_gbb_header *gbb_to;
@@ -988,18 +986,9 @@ static int preserve_gbb(const struct firmware_image *image_from,
if (preserve_flags)
gbb_to->flags = gbb_from->flags;
- hwid_to = (uint8_t *)gbb_to + gbb_to->hwid_offset;
- hwid_from = (uint8_t *)gbb_from + gbb_from->hwid_offset;
-
/* Preserve HWID. */
- len = strlen((const char *)hwid_from);
- if (len >= gbb_to->hwid_size)
- return -1;
-
- /* Zero whole area so we won't have garbage after NUL. */
- memset(hwid_to, 0, gbb_to->hwid_size);
- memcpy(hwid_to, hwid_from, len);
- return 0;
+ return futil_set_gbb_hwid(
+ gbb_to, (const char *)gbb_from + gbb_from->hwid_offset);
}
/*
diff --git a/tests/futility/test_update.sh b/tests/futility/test_update.sh
index c72a1057..302bf26a 100755
--- a/tests/futility/test_update.sh
+++ b/tests/futility/test_update.sh
@@ -91,6 +91,17 @@ cp -f "${FROM_IMAGE}" "${FROM_DIFFERENT_ROOTKEY_IMAGE}"
cp -f "${FROM_IMAGE}" "${FROM_IMAGE}.large"
truncate -s $((8388608 * 2)) "${FROM_IMAGE}.large"
+# Create GBB v1.2 images (for checking digest)
+GBB_OUTPUT="$("${FUTILITY}" gbb --digest "${TO_IMAGE}")"
+[ "${GBB_OUTPUT}" = "digest: <none>" ]
+TO_IMAGE_GBB12="${TO_IMAGE}.gbb12"
+HWID_DIGEST="adf64d2a434b610506153da42440b0b498d7369c0e98b629ede65eb59f4784fa"
+cp -f "${TO_IMAGE}" "${TO_IMAGE_GBB12}"
+patch_file "${TO_IMAGE_GBB12}" GBB 6 "\x02"
+"${FUTILITY}" gbb -s --hwid="${TO_HWID}" "${TO_IMAGE_GBB12}"
+GBB_OUTPUT="$("${FUTILITY}" gbb --digest "${TO_IMAGE_GBB12}")"
+[ "${GBB_OUTPUT}" = "digest: ${HWID_DIGEST} valid" ]
+
# Generate expected results.
cp -f "${TO_IMAGE}" "${TMP}.expected.full"
cp -f "${FROM_IMAGE}" "${TMP}.expected.rw"
@@ -112,6 +123,9 @@ cp -f "${FROM_IMAGE}" "${TMP}.expected.legacy"
RW_SECTION_B:${TMP}.to/RW_SECTION_B
"${FUTILITY}" load_fmap "${TMP}.expected.legacy" \
RW_LEGACY:${TMP}.to/RW_LEGACY
+cp -f "${TMP}.expected.full" "${TMP}.expected.full.gbb12"
+patch_file "${TMP}.expected.full.gbb12" GBB 6 "\x02"
+"${FUTILITY}" gbb -s --hwid="${FROM_HWID}" "${TMP}.expected.full.gbb12"
cp -f "${TMP}.expected.full" "${TMP}.expected.full.gbb0"
"${FUTILITY}" gbb -s --flags=0 "${TMP}.expected.full.gbb0"
cp -f "${FROM_IMAGE}" "${FROM_IMAGE}.gbb0"
@@ -187,6 +201,10 @@ test_update "Full update (--host_only)" \
-i "${TO_IMAGE}" --wp=0 --sys_props 0,0x10001,1 \
--host_only --ec_image non-exist.bin --pd_image non_exist.bin
+test_update "Full update (GBB1.2 hwid digest)" \
+ "${FROM_IMAGE}" "${TMP}.expected.full.gbb12" \
+ -i "${TO_IMAGE_GBB12}" --wp=0 --sys_props 0,0x10001,1
+
# Test RW-only update.
test_update "RW update" \
"${FROM_IMAGE}" "${TMP}.expected.rw" \