[sw/silicon_creator] Add a struct for key manager binding value

Signed-off-by: Alphan Ulusoy <alphan@google.com>
diff --git a/sw/device/silicon_creator/lib/drivers/keymgr.c b/sw/device/silicon_creator/lib/drivers/keymgr.c
index 2e64dae..86acfad 100644
--- a/sw/device/silicon_creator/lib/drivers/keymgr.c
+++ b/sw/device/silicon_creator/lib/drivers/keymgr.c
@@ -4,6 +4,7 @@
 
 #include "sw/device/silicon_creator/lib/drivers/keymgr.h"
 
+#include "sw/device/lib/base/memory.h"
 #include "sw/device/silicon_creator/lib/base/abs_mmio.h"
 
 #include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"
@@ -74,8 +75,8 @@
   return kErrorOk;
 }
 
-rom_error_t keymgr_state_advance_to_creator(const uint32_t binding_value[8],
-                                            uint32_t max_key_ver) {
+rom_error_t keymgr_state_advance_to_creator(
+    const keymgr_binding_value_t *binding_value, uint32_t max_key_ver) {
   RETURN_IF_ERROR(
       check_expected_state(KEYMGR_WORKING_STATE_STATE_VALUE_INIT,
                            KEYMGR_OP_STATUS_STATUS_VALUE_DONE_SUCCESS));
@@ -83,10 +84,10 @@
   // Write and lock (rw0c) the software binding value. This register is unlocked
   // by hardware upon a successful state transition.
   // FIXME: Consider using sec_mmio module for the following register writes.
-  for (size_t i = 0; i < 8; ++i) {
+  for (size_t i = 0; i < ARRAYSIZE(binding_value->data); ++i) {
     abs_mmio_write32(
         kBase + KEYMGR_SW_BINDING_0_REG_OFFSET + i * sizeof(uint32_t),
-        binding_value[i]);
+        binding_value->data[i]);
   }
   abs_mmio_write32(kBase + KEYMGR_SW_BINDING_REGWEN_REG_OFFSET, 0);
 
diff --git a/sw/device/silicon_creator/lib/drivers/keymgr.h b/sw/device/silicon_creator/lib/drivers/keymgr.h
index 5513012..15642cf 100644
--- a/sw/device/silicon_creator/lib/drivers/keymgr.h
+++ b/sw/device/silicon_creator/lib/drivers/keymgr.h
@@ -9,6 +9,7 @@
 #include <stdint.h>
 
 #include "sw/device/silicon_creator/lib/error.h"
+#include "sw/device/silicon_creator/lib/keymgr_binding_value.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -43,9 +44,8 @@
  * manifest.
  * @return The result of the operation.
  */
-// TODO: Switch binding_value to a wrapped struct parameter.
-rom_error_t keymgr_state_advance_to_creator(const uint32_t binding_value[8],
-                                            uint32_t max_key_version);
+rom_error_t keymgr_state_advance_to_creator(
+    const keymgr_binding_value_t *binding_value, uint32_t max_key_version);
 
 /**
  * Checks the state of the key manager.
diff --git a/sw/device/silicon_creator/lib/drivers/keymgr_unittest.cc b/sw/device/silicon_creator/lib/drivers/keymgr_unittest.cc
index 03d5b95..3ec0e48 100644
--- a/sw/device/silicon_creator/lib/drivers/keymgr_unittest.cc
+++ b/sw/device/silicon_creator/lib/drivers/keymgr_unittest.cc
@@ -16,12 +16,10 @@
 
 namespace keymgr_unittest {
 namespace {
-using ::testing::ElementsAreArray;
-using ::testing::Test;
 
 struct SwBindingCfg {
   uint32_t max_key_ver;
-  uint32_t sw_binding_value[8];
+  keymgr_binding_value_t binding_value;
 };
 
 class KeymgrTest : public mask_rom_test::MaskRomTest {
@@ -39,7 +37,7 @@
   uint32_t base_ = TOP_EARLGREY_KEYMGR_BASE_ADDR;
   SwBindingCfg cfg_ = {
       .max_key_ver = 0xA5A5A5A5,
-      .sw_binding_value = {0, 1, 2, 3, 4, 6, 7, 8},
+      .binding_value = {0, 1, 2, 3, 4, 6, 7, 8},
   };
   mask_rom_test::MockAbsMmio mmio_;
 };
@@ -77,21 +75,21 @@
                     /*err_code=*/0u);
 
   EXPECT_ABS_WRITE32(mmio_, base_ + KEYMGR_SW_BINDING_0_REG_OFFSET,
-                     cfg_.sw_binding_value[0]);
+                     cfg_.binding_value.data[0]);
   EXPECT_ABS_WRITE32(mmio_, base_ + KEYMGR_SW_BINDING_1_REG_OFFSET,
-                     cfg_.sw_binding_value[1]);
+                     cfg_.binding_value.data[1]);
   EXPECT_ABS_WRITE32(mmio_, base_ + KEYMGR_SW_BINDING_2_REG_OFFSET,
-                     cfg_.sw_binding_value[2]);
+                     cfg_.binding_value.data[2]);
   EXPECT_ABS_WRITE32(mmio_, base_ + KEYMGR_SW_BINDING_3_REG_OFFSET,
-                     cfg_.sw_binding_value[3]);
+                     cfg_.binding_value.data[3]);
   EXPECT_ABS_WRITE32(mmio_, base_ + KEYMGR_SW_BINDING_4_REG_OFFSET,
-                     cfg_.sw_binding_value[4]);
+                     cfg_.binding_value.data[4]);
   EXPECT_ABS_WRITE32(mmio_, base_ + KEYMGR_SW_BINDING_5_REG_OFFSET,
-                     cfg_.sw_binding_value[5]);
+                     cfg_.binding_value.data[5]);
   EXPECT_ABS_WRITE32(mmio_, base_ + KEYMGR_SW_BINDING_6_REG_OFFSET,
-                     cfg_.sw_binding_value[6]);
+                     cfg_.binding_value.data[6]);
   EXPECT_ABS_WRITE32(mmio_, base_ + KEYMGR_SW_BINDING_7_REG_OFFSET,
-                     cfg_.sw_binding_value[7]);
+                     cfg_.binding_value.data[7]);
   EXPECT_ABS_WRITE32(mmio_, base_ + KEYMGR_SW_BINDING_REGWEN_REG_OFFSET, 0);
 
   EXPECT_ABS_WRITE32(mmio_, base_ + KEYMGR_MAX_CREATOR_KEY_VER_REG_OFFSET,
@@ -109,7 +107,7 @@
       });
 
   EXPECT_EQ(
-      keymgr_state_advance_to_creator(cfg_.sw_binding_value, cfg_.max_key_ver),
+      keymgr_state_advance_to_creator(&cfg_.binding_value, cfg_.max_key_ver),
       kErrorOk);
 }
 
@@ -119,7 +117,7 @@
                     KEYMGR_WORKING_STATE_STATE_VALUE_RESET,
                     /*err_code=*/0u);
   EXPECT_EQ(
-      keymgr_state_advance_to_creator(cfg_.sw_binding_value, cfg_.max_key_ver),
+      keymgr_state_advance_to_creator(&cfg_.binding_value, cfg_.max_key_ver),
       kErrorKeymgrInternal);
 
   // Any non-idle status is expected to fail.
@@ -127,7 +125,7 @@
                     KEYMGR_WORKING_STATE_STATE_VALUE_INIT,
                     /*err_code=*/0u);
   EXPECT_EQ(
-      keymgr_state_advance_to_creator(cfg_.sw_binding_value, cfg_.max_key_ver),
+      keymgr_state_advance_to_creator(&cfg_.binding_value, cfg_.max_key_ver),
       kErrorKeymgrInternal);
 }
 
diff --git a/sw/device/silicon_creator/lib/keymgr_binding_value.h b/sw/device/silicon_creator/lib/keymgr_binding_value.h
new file mode 100644
index 0000000..cb017a7
--- /dev/null
+++ b/sw/device/silicon_creator/lib/keymgr_binding_value.h
@@ -0,0 +1,32 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#ifndef OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_KEYMGR_BINDING_VALUE_H_
+#define OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_KEYMGR_BINDING_VALUE_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif  // __cplusplus
+
+/**
+ * Binding value used by key manager to derive secret values.
+ *
+ * A change in this value changes the secret value of key manager, and
+ * consequently, the versioned keys and identity seeds generated at subsequent
+ * boot stages.
+ *
+ * Note: The size of this value is an implementation detail of the key manager
+ * hardware.
+ */
+typedef struct keymgr_binding_value {
+  uint32_t data[8];
+} keymgr_binding_value_t;
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif  // __cplusplus
+
+#endif  // OPENTITAN_SW_DEVICE_SILICON_CREATOR_LIB_KEYMGR_BINDING_VALUE_H_
diff --git a/sw/device/silicon_creator/lib/manifest.h b/sw/device/silicon_creator/lib/manifest.h
index 842e2d4..dc3f60f 100644
--- a/sw/device/silicon_creator/lib/manifest.h
+++ b/sw/device/silicon_creator/lib/manifest.h
@@ -9,6 +9,7 @@
 
 #include "sw/device/lib/base/macros.h"
 #include "sw/device/silicon_creator/lib/error.h"
+#include "sw/device/silicon_creator/lib/keymgr_binding_value.h"
 #include "sw/device/silicon_creator/lib/manifest_size.h"
 // FIXME: Move sigverify to sw/device/silicon_creator/lib
 #include "sw/device/silicon_creator/mask_rom/sig_verify_keys.h"
@@ -72,7 +73,7 @@
    * consequently, the versioned keys and identity seeds generated at subsequent
    * boot stages.
    */
-  uint32_t binding_value[8];
+  keymgr_binding_value_t binding_value;
   /**
    * Maximum allowed version for keys generated at the next boot stage.
    */
diff --git a/sw/device/silicon_creator/mask_rom/mask_rom.c b/sw/device/silicon_creator/mask_rom/mask_rom.c
index 0b76c46..a05bed7 100644
--- a/sw/device/silicon_creator/mask_rom/mask_rom.c
+++ b/sw/device/silicon_creator/mask_rom/mask_rom.c
@@ -133,9 +133,9 @@
     //   the current ROM_EXT.
     // TODO(#5955): Switch to manifest in C struct format update this code to
     // use the sw binding and max key version fields from the manifest.
-    uint32_t binding_value[8] = {0};
+    keymgr_binding_value_t binding_value = {0};
     uint32_t max_key_version = 0x1;
-    if (keymgr_state_advance_to_creator(binding_value, max_key_version) !=
+    if (keymgr_state_advance_to_creator(&binding_value, max_key_version) !=
         kErrorOk) {
       break;
     }
diff --git a/sw/host/rom_ext_image_tools/signer/image/src/manifest.rs b/sw/host/rom_ext_image_tools/signer/image/src/manifest.rs
index faf8755..d569596 100644
--- a/sw/host/rom_ext_image_tools/signer/image/src/manifest.rs
+++ b/sw/host/rom_ext_image_tools/signer/image/src/manifest.rs
@@ -39,7 +39,7 @@
     pub image_minor_version: u32,
     pub image_timestamp: u64,
     pub exponent: u32,
-    pub binding_value: [u32; 8usize],
+    pub binding_value: KeymgrBindingValue,
     pub max_key_version: u32,
     pub modulus: SigverifyRsaBuffer,
 }
@@ -57,6 +57,12 @@
     }
 }
 
+#[repr(C)]
+#[derive(FromBytes, AsBytes, Debug, Default)]
+pub struct KeymgrBindingValue {
+        pub data: [u32; 8usize],
+}
+
 /// Checks the layout of the manifest struct.
 ///
 /// Implemented as a function because using `offset_of!` at compile-time