[keymgr] Hook-up random compile time constants
- minor fixes to scripts
Signed-off-by: Timothy Chen <timothytim@google.com>
[keymgr] fix copy/paste issue from util gen
Signed-off-by: Timothy Chen <timothytim@google.com>
[keymgr] fix assertion variables
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 7358b81..fc2fab1 100644
--- a/hw/ip/keymgr/data/keymgr.hjson
+++ b/hw/ip/keymgr/data/keymgr.hjson
@@ -66,6 +66,61 @@
],
param_list: [
+ // Random netlist constants
+ { name: "RndCnstLfsrSeed",
+ desc: "Compile-time random bits for initial LFSR seed",
+ type: "keymgr_pkg::lfsr_seed_t"
+ randcount: "64",
+ randtype: "data",
+ }
+ { name: "RndCnstLfsrPerm",
+ desc: "Compile-time random permutation for LFSR output",
+ type: "keymgr_pkg::lfsr_perm_t"
+ randcount: "64",
+ randtype: "perm",
+ }
+ { name: "RndCnstRevisionSeed",
+ desc: "Compile-time random bits for revision seed",
+ type: "keymgr_pkg::seed_t"
+ randcount: "256",
+ randtype: "data",
+ },
+
+ { name: "RndCnstCreatorIdentitySeed",
+ desc: "Compile-time random bits for creator identity seed",
+ type: "keymgr_pkg::seed_t"
+ randcount: "256",
+ randtype: "data",
+ },
+
+ { name: "RndCnstOwnerIntIdentitySeed",
+ desc: "Compile-time random bits for owner intermediate identity seed",
+ type: "keymgr_pkg::seed_t"
+ randcount: "256",
+ randtype: "data",
+ },
+
+ { name: "RndCnstOwnerIdentitySeed",
+ desc: "Compile-time random bits for owner identity seed",
+ type: "keymgr_pkg::seed_t"
+ randcount: "256",
+ randtype: "data",
+ },
+
+ { name: "RndCnstSoftOutputSeed",
+ desc: "Compile-time random bits for software generation seed",
+ type: "keymgr_pkg::seed_t"
+ randcount: "256",
+ randtype: "data",
+ },
+
+ { name: "RndCnstHardOutputSeed",
+ desc: "Compile-time random bits for hardware generation seed",
+ type: "keymgr_pkg::seed_t"
+ randcount: "256",
+ randtype: "data",
+ },
+
{ name: "NumRomExtReg",
desc: "Number of Registers for ROM_ext descriptor",
type: "int",
diff --git a/hw/ip/keymgr/rtl/keymgr.sv b/hw/ip/keymgr/rtl/keymgr.sv
index c91ce3f..6e26c97 100644
--- a/hw/ip/keymgr/rtl/keymgr.sv
+++ b/hw/ip/keymgr/rtl/keymgr.sv
@@ -8,7 +8,15 @@
`include "prim_assert.sv"
module keymgr import keymgr_pkg::*; #(
- parameter logic AlertAsyncOn = 1'b1
+ parameter logic AlertAsyncOn = 1'b1,
+ parameter lfsr_seed_t RndCnstLfsrSeed = RndCnstLfsrSeedDefault,
+ parameter lfsr_perm_t RndCnstLfsrPerm = RndCnstLfsrPermDefault,
+ parameter seed_t RndCnstRevisionSeed = RndCnstRevisionSeedDefault,
+ parameter seed_t RndCnstCreatorIdentitySeed = RndCnstCreatorIdentitySeedDefault,
+ parameter seed_t RndCnstOwnerIntIdentitySeed = RndCnstOwnerIntIdentitySeedDefault,
+ parameter seed_t RndCnstOwnerIdentitySeed = RndCnstOwnerIdentitySeedDefault,
+ parameter seed_t RndCnstSoftOutputSeed = RndCnstSoftOutputSeedDefault,
+ parameter seed_t RndCnstHardOutputSeed = RndCnstHardOutputSeedDefault
) (
input clk_i,
input rst_ni,
@@ -43,7 +51,7 @@
`ASSERT_INIT(AdvDataWidth_A, AdvDataWidth <= KDFMaxWidth)
`ASSERT_INIT(IdDataWidth_A, IdDataWidth <= KDFMaxWidth)
`ASSERT_INIT(GenDataWidth_A, GenDataWidth <= KDFMaxWidth)
- `ASSERT_INIT(OutputKeyDiff_A, HardOutputKey != SoftOutputKey)
+ `ASSERT_INIT(OutputKeyDiff_A, RndCnstHardOutputSeed != RndCnstSoftOutputSeed)
// Register module
keymgr_reg2hw_t reg2hw;
@@ -77,8 +85,11 @@
logic ctrl_lfsr_en, data_lfsr_en, sideload_lfsr_en;
prim_lfsr #(
- .LfsrDw(64),
- .StateOutDw(64)
+ .LfsrDw(LfsrWidth),
+ .StateOutDw(LfsrWidth),
+ .DefaultSeed(RndCnstLfsrSeed),
+ .StatePermEn(1'b1),
+ .StatePerm(RndCnstLfsrPerm)
) u_lfsr (
.clk_i,
.rst_ni,
@@ -196,7 +207,7 @@
logic [KeyWidth-1:0] creator_seed;
assign creator_seed = flash_i.seeds[flash_ctrl_pkg::CreatorSeedIdx];
assign adv_matrix[Creator] = AdvDataWidth'({reg2hw.rom_ext_desc,
- RevisionSecret,
+ RndCnstRevisionSeed,
otp_i.devid,
lc_i.health_state,
creator_seed});
@@ -215,15 +226,15 @@
assign id_matrix[i] = {IdLfsrCopies{lfsr[31:0]}};
end
- assign id_matrix[Creator] = CreatorIdentityKey;
- assign id_matrix[OwnerInt] = OwnerIntIdentityKey;
- assign id_matrix[Owner] = OwnerIdentityKey;
+ assign id_matrix[Creator] = RndCnstCreatorIdentitySeed;
+ assign id_matrix[OwnerInt] = RndCnstOwnerIntIdentitySeed;
+ assign id_matrix[Owner] = RndCnstOwnerIdentitySeed;
// Generate output operation input construction
logic [KeyWidth-1:0] output_key;
- assign output_key = (key_sel == HwKey) ? HardOutputKey : SoftOutputKey;
+ assign output_key = (key_sel == HwKey) ? RndCnstHardOutputSeed : RndCnstSoftOutputSeed;
assign gen_in = (stage_sel == Disable) ? {GenLfsrCopies{lfsr[31:0]}} : {reg2hw.key_version,
reg2hw.salt,
output_key};
diff --git a/hw/ip/keymgr/rtl/keymgr_pkg.sv b/hw/ip/keymgr/rtl/keymgr_pkg.sv
index e13e710..d385079 100644
--- a/hw/ip/keymgr/rtl/keymgr_pkg.sv
+++ b/hw/ip/keymgr/rtl/keymgr_pkg.sv
@@ -12,21 +12,39 @@
parameter int KmacDataIfWidth = 64; // KMAC interface data width
parameter int KeyMgrStages = 3; // Number of key manager stages (creator, ownerInt, owner)
parameter int RomExtDescWidth = 128; // Size of rom_ext hash, truncated
- parameter int LfsrWidth = 64;
parameter int Shares = 2; // number of key shares
// These should be defined in another module's package
parameter int HealthStateWidth = 128;
parameter int DevIdWidth = 256;
- // These should eventually reference top_pkg so that they can be easily managed per
- // device
- parameter logic[KeyWidth-1:0] RevisionSecret = 256'hAAAA5555;
- parameter logic[KeyWidth-1:0] CreatorIdentityKey = 256'hDEADBEEF;
- parameter logic[KeyWidth-1:0] OwnerIntIdentityKey = 256'hDEADBEEF;
- parameter logic[KeyWidth-1:0] OwnerIdentityKey = 256'hDEADBEEF;
- parameter logic[KeyWidth-1:0] SoftOutputKey = 256'hDEADBEEF;
- parameter logic[KeyWidth-1:0] HardOutputKey = 256'hDEADBEEE;
+ // Default seeds
+ // These are generated using random.org byte dumper
+ typedef logic [KeyWidth-1:0] seed_t;
+ parameter seed_t RndCnstRevisionSeedDefault =
+ 256'h3a0a6d73cd50897de4d744bd65ebdb3837ea77087d878651c517c18a5742b2f9;
+ parameter seed_t RndCnstCreatorIdentitySeedDefault =
+ 256'h6d234651d535ebb0dce4d82f503096614355fc7b84595e4f67a866177d421df6;
+ parameter seed_t RndCnstOwnerIntIdentitySeedDefault =
+ 256'hdba98db4fb1413b32fd5a4deac3ce546966a4bc2761235643358c8e76083d382;
+ parameter seed_t RndCnstOwnerIdentitySeedDefault =
+ 256'h8c0a27ef53e0e0bf5f5f5e26a30a0d0db10761ed802c6d2fd22873209976021e;
+ parameter seed_t RndCnstSoftOutputSeedDefault =
+ 256'h99cadb2c2d9b438591d943a89bc64dbb3bc2abc842eeea5faf74d27f7a7c99b6;
+ parameter seed_t RndCnstHardOutputSeedDefault =
+ 256'hd551b351decbb6f687c7f5c845363f12d6411fae812e16b23bc8ae59885a56b1;
+
+ // Default Lfsr configurations
+ // These LFSR parameters have been generated with
+ // $ hw/ip/prim/util/gen-lfsr-seed.py --width 64 --seed 691876113 --prefix ""
+ parameter int LfsrWidth = 64;
+ typedef logic [LfsrWidth-1:0] lfsr_seed_t;
+ typedef logic [LfsrWidth-1:0][$clog2(LfsrWidth)-1:0] lfsr_perm_t;
+ parameter lfsr_seed_t RndCnstLfsrSeedDefault = 64'h22d326255bd24320;
+ parameter lfsr_perm_t RndCnstLfsrPermDefault = {
+ 128'h16108c9f9008aa37e5118d1ec1df64a7,
+ 256'h24f3f1b73537f42d38383ee8f897286df81d49ab54b6bbbb666cbd1a16c41252
+ };
// Width calculations
// These are the largest calculations in use across all stages
diff --git a/hw/ip/prim/util/gen-lfsr-seed.py b/hw/ip/prim/util/gen-lfsr-seed.py
index f287c8f..6bf56e6 100755
--- a/hw/ip/prim/util/gen-lfsr-seed.py
+++ b/hw/ip/prim/util/gen-lfsr-seed.py
@@ -40,6 +40,25 @@
return literal_str
+def _blockify(s, size, limit):
+ """ Make sure the output does not exceed a certain size per line"""
+
+ str_idx = 2
+ remain = size % (limit * 4)
+ numbits = remain if remain else limit * 4
+ s_list = []
+
+ remain = size
+ while remain > 0:
+ s_incr = int(numbits / 4)
+ s_list.append("{}'h{}".format(numbits, s[str_idx: str_idx + s_incr]))
+ str_idx += s_incr
+ remain -= numbits
+ numbits = limit * 4
+
+ return(",\n ".join(s_list))
+
+
def _get_random_perm_hex_literal(numel):
""" Compute a random permutation of 'numel' elements and
return as packed hex literal"""
@@ -52,8 +71,7 @@
literal_str += format(k, '0' + str(width) + 'b')
# convert to hex for space efficiency
literal_str = hex(int(literal_str, 2))
- literal_str = str(width * numel) + "'h" + literal_str[2:]
- return literal_str
+ return _blockify(literal_str, width * numel, 64)
def _wrapped_docstring():
@@ -126,8 +144,9 @@
typedef logic [{}LfsrWidth-1:0] {}lfsr_seed_t;
typedef logic [{}LfsrWidth-1:0][$clog2({}LfsrWidth)-1:0] {}lfsr_perm_t;
parameter {}lfsr_seed_t RndCnst{}LfsrSeedDefault = {};
-parameter {}lfsr_perm_t RndCnst{}LfsrPermDefault =
- {};
+parameter {}lfsr_perm_t RndCnst{}LfsrPermDefault = {{
+ {}
+}};
'''.format(args.width, args.seed, args.prefix,
args.prefix, args.width,
args.prefix, type_prefix,
diff --git a/hw/top_earlgrey/data/top_earlgrey_rnd_cnst_pkg.sv.tpl b/hw/top_earlgrey/data/top_earlgrey_rnd_cnst_pkg.sv.tpl
index 92fd81b..2210abb 100644
--- a/hw/top_earlgrey/data/top_earlgrey_rnd_cnst_pkg.sv.tpl
+++ b/hw/top_earlgrey/data/top_earlgrey_rnd_cnst_pkg.sv.tpl
@@ -11,7 +11,8 @@
hexstr = str(hexstr[2:]).upper()
# Block width in hex chars
blockwidth = 64
- numbits = randwidth % (4*blockwidth)
+ remainder = randwidth % (4*blockwidth)
+ numbits = remainder if remainder else 4*blockwidth
idx = 0
hexblocks = []
while randwidth > 0: