summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--futility/updater.c6
-rw-r--r--futility/updater.h15
-rw-r--r--futility/updater_quirks.c35
-rw-r--r--futility/updater_utils.c26
-rw-r--r--futility/updater_utils.h5
5 files changed, 86 insertions, 1 deletions
diff --git a/futility/updater.c b/futility/updater.c
index 6a7d8ffa..f634c227 100644
--- a/futility/updater.c
+++ b/futility/updater.c
@@ -660,7 +660,7 @@ static int check_compatible_platform(struct updater_config *cfg)
/*
* Returns a valid root key from GBB header, or NULL on failure.
*/
-static const struct vb2_packed_key *get_rootkey(
+const struct vb2_packed_key *get_rootkey(
const struct vb2_gbb_header *gbb)
{
struct vb2_packed_key *key = NULL;
@@ -1352,6 +1352,10 @@ static int updater_apply_white_label(struct updater_config *cfg,
ERROR("Failed to get system current firmware\n");
return 1;
}
+ if (get_config_quirk(QUIRK_OVERRIDE_SIGNATURE_ID, cfg) &&
+ is_write_protection_enabled(cfg))
+ quirk_override_signature_id(
+ cfg, model, &signature_id);
}
return !!model_apply_white_label(
model, cfg->archive, signature_id, tmp_image);
diff --git a/futility/updater.h b/futility/updater.h
index c83ebfc2..e11cc745 100644
--- a/futility/updater.h
+++ b/futility/updater.h
@@ -43,6 +43,7 @@ enum quirk_types {
QUIRK_EVE_SMM_STORE,
QUIRK_ALLOW_EMPTY_WLTAG,
QUIRK_EC_PARTIAL_RECOVERY,
+ QUIRK_OVERRIDE_SIGNATURE_ID,
QUIRK_MAX,
};
@@ -124,6 +125,12 @@ enum updater_error_codes {
extern const char * const updater_error_messages[];
/*
+ * Returns a valid root key from GBB header, or NULL on failure.
+ */
+const struct vb2_packed_key *get_rootkey(
+ const struct vb2_gbb_header *gbb);
+
+/*
* The main updater to update system firmware using the configuration parameter.
* Returns UPDATE_ERR_DONE if success, otherwise failure.
*/
@@ -168,6 +175,14 @@ int get_system_property(enum system_property_type property_type,
*/
const char * const updater_get_default_quirks(struct updater_config *cfg);
+/*
+ * Overrides signature id if the device was shipped with known
+ * special rootkey.
+ */
+int quirk_override_signature_id(struct updater_config *cfg,
+ struct model_config *model,
+ const char **signature_id);
+
/* Functions from updater_archive.c */
/*
diff --git a/futility/updater_quirks.c b/futility/updater_quirks.c
index 1dfbedda..a2015f62 100644
--- a/futility/updater_quirks.c
+++ b/futility/updater_quirks.c
@@ -55,6 +55,8 @@ static const struct quirks_record quirks_records[] = {
{ .match = "Google_Reks.", .quirks = "allow_empty_wltag" },
{ .match = "Google_Relm.", .quirks = "allow_empty_wltag" },
{ .match = "Google_Wizpig.", .quirks = "allow_empty_wltag" },
+
+ { .match = "Google_Phaser.", .quirks = "override_signature_id" },
};
/* Preserves meta data and reload image contents from given file path. */
@@ -423,6 +425,12 @@ void updater_register_quirks(struct updater_config *cfg)
quirks->help = "chromium/1024401; recover EC by partial RO update.";
quirks->apply = quirk_ec_partial_recovery;
quirks->value = -1; /* Decide at runtime. */
+
+ quirks = &cfg->quirks[QUIRK_OVERRIDE_SIGNATURE_ID];
+ quirks->name = "override_signature_id";
+ quirks->help = "chromium/146876241; override signature id for "
+ "devices shipped with different root key.";
+ quirks->apply = NULL; /* Simple config. */
}
/*
@@ -448,3 +456,30 @@ const char * const updater_get_default_quirks(struct updater_config *cfg)
}
return NULL;
}
+
+/*
+ * Overrides signature id if the device was shipped with known
+ * special rootkey.
+ */
+int quirk_override_signature_id(struct updater_config *cfg,
+ struct model_config *model,
+ const char **signature_id)
+{
+ const char * const DOPEFISH_KEY_HASH =
+ "9a1f2cc319e2f2e61237dc51125e35ddd4d20984";
+
+ /* b/146876241 */
+ assert(model);
+ if (strcmp(model->name, "phaser360") == 0) {
+ struct firmware_image *image = &cfg->image_current;
+ const char *key_hash = get_firmware_rootkey_hash(image);
+ if (key_hash && strcmp(key_hash, DOPEFISH_KEY_HASH) == 0) {
+ const char * const sig_dopefish = "phaser360-dopefish";
+ WARN("A Phaser360 with Dopefish rootkey - "
+ "override signature_id to '%s'.\n", sig_dopefish);
+ *signature_id = sig_dopefish;
+ }
+ }
+
+ return 0;
+}
diff --git a/futility/updater_utils.c b/futility/updater_utils.c
index 7a8185b1..3807fbbe 100644
--- a/futility/updater_utils.c
+++ b/futility/updater_utils.c
@@ -12,6 +12,7 @@
#include "2common.h"
#include "crossystem.h"
#include "host_misc.h"
+#include "util_misc.h"
#include "updater.h"
#define COMMAND_BUFFER_SIZE 256
@@ -662,3 +663,28 @@ void remove_all_temp_files(struct tempfile *head)
free(head);
}
}
+
+/*
+ * Returns rootkey hash of firmware image, or NULL on failure.
+ */
+const char *get_firmware_rootkey_hash(const struct firmware_image *image)
+{
+ const struct vb2_gbb_header *gbb = NULL;
+ const struct vb2_packed_key *rootkey = NULL;
+
+ assert(image->data);
+
+ gbb = find_gbb(image);
+ if (!gbb) {
+ WARN("No GBB found in image.\n");
+ return NULL;
+ }
+
+ rootkey = get_rootkey(gbb);
+ if (!rootkey) {
+ WARN("No rootkey found in image.\n");
+ return NULL;
+ }
+
+ return packed_key_sha1_string(rootkey);
+}
diff --git a/futility/updater_utils.h b/futility/updater_utils.h
index eb455d13..f5248f86 100644
--- a/futility/updater_utils.h
+++ b/futility/updater_utils.h
@@ -207,4 +207,9 @@ enum system_property_type {
/* Helper function to initialize system properties. */
void init_system_properties(struct system_property *props, int num);
+/*
+ * Returns rootkey hash of firmware image, or NULL on failure.
+ */
+const char *get_firmware_rootkey_hash(const struct firmware_image *image);
+
#endif /* VBOOT_REFERENCE_FUTILITY_UPDATER_UTILS_H_ */