[keymgr, rom_ctrl] Hook up rom digest data to keymgr
Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/keymgr/data/keymgr.hjson b/hw/ip/keymgr/data/keymgr.hjson
index fe41388..22b372a 100644
--- a/hw/ip/keymgr/data/keymgr.hjson
+++ b/hw/ip/keymgr/data/keymgr.hjson
@@ -86,6 +86,12 @@
act: "rcv",
package: "lc_ctrl_pkg",
},
+ { struct: "keymgr_data"
+ type: "uni"
+ name: "rom_digest"
+ act: "rcv"
+ package: "rom_ctrl_pkg"
+ },
],
param_list: [
diff --git a/hw/ip/keymgr/dv/env/keymgr_if.sv b/hw/ip/keymgr/dv/env/keymgr_if.sv
index d5cfea5..2cdc7bd 100644
--- a/hw/ip/keymgr/dv/env/keymgr_if.sv
+++ b/hw/ip/keymgr/dv/env/keymgr_if.sv
@@ -12,6 +12,7 @@
otp_ctrl_part_pkg::otp_hw_cfg_t otp_hw_cfg;
otp_ctrl_pkg::otp_keymgr_key_t otp_key;
flash_ctrl_pkg::keymgr_flash_t flash;
+ rom_ctrl_pkg::keymgr_data_t rom_digest;
keymgr_pkg::hw_key_req_t kmac_key;
keymgr_pkg::hw_key_req_t hmac_key;
@@ -76,6 +77,8 @@
otp_hw_cfg.data.device_id = 'hF0F0;
otp_key = otp_ctrl_pkg::OTP_KEYMGR_KEY_DEFAULT;
flash = flash_ctrl_pkg::KEYMGR_FLASH_DEFAULT;
+ rom_digest.data = 256'hA20A046CF42E6EAC560A3F82BFA76285B5C1D4AEA7C915E49A32D1C89BE0F507;
+ rom_digest.valid = '1;
endtask
// reset local exp variables when reset is issued
@@ -107,6 +110,7 @@
bit [keymgr_pkg::DevIdWidth-1:0] local_otp_device_id;
otp_ctrl_pkg::otp_keymgr_key_t local_otp_key;
flash_ctrl_pkg::keymgr_flash_t local_flash;
+ rom_ctrl_pkg::keymgr_data_t local_rom_digest;
// async delay as these signals are from different clock domain
#($urandom_range(1000, 0) * 1ns);
@@ -128,6 +132,10 @@
!(local_flash.seeds[i] inside {0, '1});
}, , msg_id)
+ `DV_CHECK_STD_RANDOMIZE_WITH_FATAL(local_rom_digest,
+ local_rom_digest.valid == 1;
+ !(local_rom_digest.data inside {0, '1});, , msg_id)
+
// make HW input to be all 0s or 1s
repeat (num_invalid_input) begin
randcase
@@ -157,6 +165,7 @@
otp_hw_cfg.data.device_id = local_otp_device_id;
otp_key = local_otp_key;
flash = local_flash;
+ rom_digest = local_rom_digest;
endtask
// update kmac key for comparison during KDF
diff --git a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
index 3e8458c..a07295a 100644
--- a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
+++ b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
@@ -16,6 +16,7 @@
bit [keymgr_pkg::KeyWidth-1:0] HardwareRevisionSecret;
bit [keymgr_pkg::DevIdWidth-1:0] DeviceIdentifier;
bit [keymgr_pkg::HealthStateWidth-1:0] HealthMeasurement;
+ bit [keymgr_pkg::KeyWidth-1:0] RomDigest;
bit [keymgr_pkg::KeyWidth-1:0] DiversificationKey;
} adv_creator_data_t;
@@ -627,6 +628,10 @@
is_err = 1;
end
+ if (cfg.keymgr_vif.rom_digest.data inside {0, '1}) begin
+ is_err = 1;
+ end
+
if (cfg.keymgr_vif.otp_key.key_share0 inside {0, '1}) begin
is_err = 1;
end
@@ -686,15 +691,19 @@
act = {<<8{byte_data_q}};
exp.DiversificationKey = cfg.keymgr_vif.flash.seeds[flash_ctrl_pkg::CreatorSeedIdx];
+ exp.RomDigest = cfg.keymgr_vif.rom_digest.data;
exp.HealthMeasurement = cfg.keymgr_vif.keymgr_div;
exp.DeviceIdentifier = cfg.keymgr_vif.otp_hw_cfg.data.device_id;
exp.HardwareRevisionSecret = keymgr_pkg::RndCnstRevisionSeedDefault;
+
for (int i = 0; i < keymgr_reg_pkg::NumSwBindingReg; i++) begin
uvm_reg rg = ral.get_reg_by_name($sformatf("sw_binding_%0d", i));
exp.SoftwareBinding[i] = `gmv(rg);
end
+ // The order of the string creation must match the design
`CREATE_CMP_STR(DiversificationKey)
+ `CREATE_CMP_STR(RomDigest)
`CREATE_CMP_STR(HealthMeasurement)
`CREATE_CMP_STR(DeviceIdentifier)
`CREATE_CMP_STR(HardwareRevisionSecret)
diff --git a/hw/ip/keymgr/dv/tb.sv b/hw/ip/keymgr/dv/tb.sv
index 92e673c..5f9c61b 100644
--- a/hw/ip/keymgr/dv/tb.sv
+++ b/hw/ip/keymgr/dv/tb.sv
@@ -54,6 +54,7 @@
.lc_keymgr_div_i (keymgr_if.keymgr_div),
.otp_key_i (keymgr_if.otp_key),
.otp_hw_cfg_i (keymgr_if.otp_hw_cfg),
+ .rom_digest_i (keymgr_if.rom_digest),
.edn_o (edn_if.req),
.edn_i ({edn_if.ack, edn_if.d_data}),
.flash_i (keymgr_if.flash),
diff --git a/hw/ip/keymgr/keymgr.core b/hw/ip/keymgr/keymgr.core
index c9dac82..9f0a7a6 100644
--- a/hw/ip/keymgr/keymgr.core
+++ b/hw/ip/keymgr/keymgr.core
@@ -15,6 +15,7 @@
- lowrisc:prim:msb_extend
- lowrisc:ip:keymgr_pkg
- lowrisc:ip:kmac_pkg
+ - lowrisc:ip:rom_ctrl
files:
- rtl/keymgr_reg_top.sv
- rtl/keymgr_sideload_key_ctrl.sv
diff --git a/hw/ip/keymgr/rtl/keymgr.sv b/hw/ip/keymgr/rtl/keymgr.sv
index d0c79a3..d2a6c75 100644
--- a/hw/ip/keymgr/rtl/keymgr.sv
+++ b/hw/ip/keymgr/rtl/keymgr.sv
@@ -55,6 +55,9 @@
output edn_pkg::edn_req_t edn_o,
input edn_pkg::edn_rsp_t edn_i,
+ // connection to rom_ctrl
+ input rom_ctrl_pkg::keymgr_data_t rom_digest_i,
+
// interrupts and alerts
output logic intr_op_done_o,
input prim_alert_pkg::alert_rx_t [keymgr_reg_pkg::NumAlerts-1:0] alert_rx_i,
@@ -316,6 +319,7 @@
RndCnstRevisionSeed,
otp_hw_cfg_i.data.device_id,
lc_keymgr_div_i,
+ rom_digest_i.data,
creator_seed});
logic unused_otp_bits;
@@ -323,7 +327,8 @@
assign adv_dvalid[Creator] = creator_seed_vld &
devid_vld &
- health_state_vld;
+ health_state_vld &
+ rom_digest_i.valid;
// Advance to owner_intermediate_key
logic [KeyWidth-1:0] owner_seed;
diff --git a/hw/ip/keymgr/rtl/keymgr_pkg.sv b/hw/ip/keymgr/rtl/keymgr_pkg.sv
index d795f2e..4bf3760 100644
--- a/hw/ip/keymgr/rtl/keymgr_pkg.sv
+++ b/hw/ip/keymgr/rtl/keymgr_pkg.sv
@@ -69,7 +69,7 @@
// Width calculations
// These are the largest calculations in use across all stages
- parameter int AdvDataWidth = SwBindingWidth + 2*KeyWidth + DevIdWidth + HealthStateWidth;
+ parameter int AdvDataWidth = SwBindingWidth + 3*KeyWidth + DevIdWidth + HealthStateWidth;
parameter int IdDataWidth = KeyWidth;
// key version + salt + key ID + constant
parameter int GenDataWidth = 32 + SaltWidth + KeyWidth*2;
diff --git a/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson b/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
index bb543d3..15bda2e 100644
--- a/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
+++ b/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
@@ -4338,6 +4338,18 @@
index: -1
}
{
+ name: rom_digest
+ struct: keymgr_data
+ package: rom_ctrl_pkg
+ type: uni
+ act: rcv
+ width: 1
+ inst_name: keymgr
+ default: ""
+ top_signame: rom_ctrl_keymgr_data
+ index: -1
+ }
+ {
name: tl
struct: tl
package: tlul_pkg
@@ -5130,6 +5142,10 @@
act: req
width: 1
inst_name: rom_ctrl
+ default: ""
+ end_idx: -1
+ top_type: broadcast
+ top_signame: rom_ctrl_keymgr_data
index: -1
}
{
@@ -5736,6 +5752,10 @@
[
pwrmgr_aon.rom_ctrl
]
+ rom_ctrl.keymgr_data:
+ [
+ keymgr.rom_digest
+ ]
rv_core_ibex.crash_dump:
[
rstmgr_aon.cpu_dump
@@ -13819,6 +13839,18 @@
index: -1
}
{
+ name: rom_digest
+ struct: keymgr_data
+ package: rom_ctrl_pkg
+ type: uni
+ act: rcv
+ width: 1
+ inst_name: keymgr
+ default: ""
+ top_signame: rom_ctrl_keymgr_data
+ index: -1
+ }
+ {
name: tl
struct: tl
package: tlul_pkg
@@ -14292,6 +14324,10 @@
act: req
width: 1
inst_name: rom_ctrl
+ default: ""
+ end_idx: -1
+ top_type: broadcast
+ top_signame: rom_ctrl_keymgr_data
index: -1
}
{
@@ -16293,6 +16329,17 @@
default: ""
}
{
+ package: rom_ctrl_pkg
+ struct: keymgr_data
+ signame: rom_ctrl_keymgr_data
+ width: 1
+ type: uni
+ end_idx: -1
+ act: req
+ suffix: ""
+ default: ""
+ }
+ {
package: ibex_pkg
struct: crash_dump
signame: rv_core_ibex_crash_dump
diff --git a/hw/top_earlgrey/data/top_earlgrey.hjson b/hw/top_earlgrey/data/top_earlgrey.hjson
index 3c179f2..514272b 100644
--- a/hw/top_earlgrey/data/top_earlgrey.hjson
+++ b/hw/top_earlgrey/data/top_earlgrey.hjson
@@ -872,6 +872,7 @@
'pwrmgr_aon.strap' : ['pinmux_aon.strap_en'],
'pwrmgr_aon.low_power' : ['pinmux_aon.sleep_en','aon_timer_aon.sleep_mode'],
'rom_ctrl.pwrmgr_data' : ['pwrmgr_aon.rom_ctrl'],
+ 'rom_ctrl.keymgr_data' : ['keymgr.rom_digest'],
'flash_ctrl.keymgr' : ['keymgr.flash'],
'alert_handler.crashdump' : ['rstmgr_aon.alert_dump'],
'rv_core_ibex.crash_dump' : ['rstmgr_aon.cpu_dump'],
diff --git a/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv b/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
index 0e9ec66..003498f 100644
--- a/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
+++ b/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
@@ -489,6 +489,7 @@
logic pwrmgr_aon_strap;
logic pwrmgr_aon_low_power;
rom_ctrl_pkg::pwrmgr_data_t rom_ctrl_pwrmgr_data;
+ rom_ctrl_pkg::keymgr_data_t rom_ctrl_keymgr_data;
ibex_pkg::crash_dump_t rv_core_ibex_crash_dump;
logic usbdev_usb_out_of_rst;
logic usbdev_usb_aon_wake_en;
@@ -2092,6 +2093,7 @@
.flash_i(flash_ctrl_keymgr),
.lc_keymgr_en_i(lc_ctrl_lc_keymgr_en),
.lc_keymgr_div_i(lc_ctrl_lc_keymgr_div),
+ .rom_digest_i(rom_ctrl_keymgr_data),
.tl_i(keymgr_tl_req),
.tl_o(keymgr_tl_rsp),
@@ -2292,7 +2294,7 @@
// Inter-module signals
.rom_cfg_i(ast_rom_cfg),
.pwrmgr_data_o(rom_ctrl_pwrmgr_data),
- .keymgr_data_o(),
+ .keymgr_data_o(rom_ctrl_keymgr_data),
.kmac_data_o(kmac_app_req[1]),
.kmac_data_i(kmac_app_rsp[1]),
.regs_tl_i(rom_ctrl_regs_tl_req),