summaryrefslogtreecommitdiff
path: root/common/new_nvmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/new_nvmem.c')
-rw-r--r--common/new_nvmem.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/common/new_nvmem.c b/common/new_nvmem.c
index 4975d4fbe6..d193273ac2 100644
--- a/common/new_nvmem.c
+++ b/common/new_nvmem.c
@@ -19,6 +19,7 @@
#include "nvmem_vars.h"
#include "shared_mem.h"
#include "system.h"
+#include "system_chip.h"
#include "task.h"
#include "timer.h"
@@ -463,15 +464,27 @@ static STATE_CLEAR_DATA *get_scd(void)
ri.offset);
}
-/* Veirify page header hash. */
-static int page_header_is_valid(struct nn_page_header *ph)
+/*
+ * Make sure page header hash is different between prod and other types of
+ * images.
+ */
+static uint32_t calculate_page_header_hash(struct nn_page_header *ph)
{
- uint32_t ph_hash;
+ uint32_t hash;
+ static const uint32_t salt[] = {1, 2, 3, 4};
+
+ BUILD_ASSERT(sizeof(hash) ==
+ offsetof(struct nn_page_header, page_hash));
- app_compute_hash_wrapper(ph, offsetof(struct nn_page_header, page_hash),
- &ph_hash, sizeof(ph_hash));
+ app_cipher(salt, &hash, ph, sizeof(hash));
- return ph_hash == ph->page_hash;
+ return hash;
+}
+
+/* Veirify page header hash. */
+static int page_header_is_valid(struct nn_page_header *ph)
+{
+ return calculate_page_header_hash(ph) == ph->page_hash;
}
/* Convert flash page number in 0..255 range into actual flash address. */
@@ -631,10 +644,7 @@ static enum ec_error_list set_first_page_header(void)
struct nn_page_header *fph; /* Address in flash. */
ph.data_offset = sizeof(ph);
- app_compute_hash_wrapper(&ph,
- offsetof(struct nn_page_header, page_hash),
- &ph.page_hash, sizeof(ph.page_hash));
-
+ ph.page_hash = calculate_page_header_hash(&ph);
fph = flash_index_to_ph(page_list[0]);
rv = write_to_flash(fph, &ph, sizeof(ph));
@@ -956,9 +966,7 @@ static void start_new_flash_page(size_t data_size)
ph.data_offset = sizeof(ph) + data_size;
ph.page_number = master_at.mt.ph->page_number + 1;
- app_compute_hash_wrapper(&ph,
- offsetof(struct nn_page_header, page_hash),
- &ph.page_hash, sizeof(ph.page_hash));
+ ph.page_hash = calculate_page_header_hash(&ph);
master_at.list_index++;
if (master_at.list_index == ARRAY_SIZE(page_list))
report_no_payload_failure(NVMEMF_PAGE_LIST_OVERFLOW);