[keymgr] Minor fixes
- Fixes #8256
- Random population should populate all slots
- If root key is not valid, downstream operations should fail
Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/keymgr/lint/keymgr.waiver b/hw/ip/keymgr/lint/keymgr.waiver
index 2b7a3a2..5e5d415 100644
--- a/hw/ip/keymgr/lint/keymgr.waiver
+++ b/hw/ip/keymgr/lint/keymgr.waiver
@@ -4,6 +4,9 @@
#
# waiver file for keymgr
+waive -rules {CONST_FF} -location {keymgr_reg_top.sv} -regexp {.*rst_done.*} \
+ -comment "rst_done is part of the back-pressure process to ensure all resets are released."
+
waive -rules {MISSING_STATE} -location {keymgr_ctrl.sv} -regexp {.*StCtrlDisabled.*} \
-comment "Disabled state absorbed into default."
diff --git a/hw/ip/keymgr/rtl/keymgr_ctrl.sv b/hw/ip/keymgr/rtl/keymgr_ctrl.sv
index 975ee37..1dabea3 100644
--- a/hw/ip/keymgr/rtl/keymgr_ctrl.sv
+++ b/hw/ip/keymgr/rtl/keymgr_ctrl.sv
@@ -225,8 +225,7 @@
// interaction between main fsm and prng
///////////////////////////
- logic prng_en;
- assign prng_en_o = prng_en | disabled | invalid | wipe_req;
+ assign prng_en_o = random_req | disabled | invalid | wipe_req;
//////////////////////////
// Main Control FSM
@@ -267,8 +266,12 @@
// key state is intentionally not reset
- always_ff @(posedge clk_i) begin
- key_state_q <= key_state_d;
+ always_ff @(posedge clk_i or negedge rst_ni) begin
+ if (!rst_ni) begin
+ key_state_q <= '0;
+ end else begin
+ key_state_q <= key_state_d;
+ end
end
// root key valid sync
@@ -314,6 +317,12 @@
key_state_d[i][1] = '0;
end
end
+ end else begin
+ // if root key is not valid, load and invalid value
+ for (int i = 0; i < CDIs; i++) begin
+ key_state_d[i][0] = '0;
+ key_state_d[i][1] = '{default: '1};
+ end
end
end
@@ -396,7 +405,6 @@
// enable prng toggling
prng_reseed_req_o = 1'b0;
- prng_en = 1'b0;
// initialization complete
init_o = 1'b0;
@@ -408,8 +416,6 @@
unique case (state_q)
// Only advance can be called from reset state
StCtrlReset: begin
- // in reset state, don't enable entropy yet, since there are no users.
- prng_en = 1'b0;
// always use random data for advance, since out of reset state
// the key state will be randomized.
@@ -435,15 +441,12 @@
// This state does not accept any command.
StCtrlRandom: begin
- prng_en = 1'b1;
+ random_req = 1'b1;
- if (cnt < EntropyRounds-1) begin
- random_req = 1'b1;
- end
// when mask population is complete, xor the root_key into the zero share
// if in the future the root key is updated to 2 shares, it will direclty overwrite
// the values here
- else begin
+ if (cnt == EntropyRounds-1) begin
random_ack = 1'b1;
state_d = StCtrlRootKey;
end