| # Copyright lowRISC contributors. | |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| # SPDX-License-Identifier: Apache-2.0 | |
| load("//rules:autogen.bzl", "autogen_hjson_header") | |
| load("//rules:otp.bzl", "STD_OTP_OVERLAYS", "otp_alert_digest", "otp_image", "otp_json", "otp_partition") | |
| load("@rules_pkg//pkg:mappings.bzl", "pkg_files") | |
| load("@bazel_skylib//rules:common_settings.bzl", "int_flag", "string_flag") | |
| package(default_visibility = ["//visibility:public"]) | |
| # These configurations expose the OTP image generation tool's command line | |
| # arguments to enable dvsim to pass this through Bazel to the underlying OTP | |
| # image generation script. This is required to enable dvsim to invoke OTP image | |
| # generation as part of the Bazel build process, while still enabling the use of | |
| # multiple seeds needed to achieve DV coverage. | |
| int_flag( | |
| name = "img_seed", | |
| build_setting_default = 0, | |
| ) | |
| int_flag( | |
| name = "lc_seed", | |
| build_setting_default = 0, | |
| ) | |
| int_flag( | |
| name = "otp_seed", | |
| build_setting_default = 0, | |
| ) | |
| string_flag( | |
| name = "data_perm", | |
| build_setting_default = "", | |
| ) | |
| # This package must be kept in sync with get_otp_images() from //rules:otp.bzl. | |
| # That is, each OTP image referenced by the macro should have a definition in | |
| # this BUILD file. | |
| filegroup( | |
| name = "all_files", | |
| srcs = glob(["**"]), | |
| ) | |
| autogen_hjson_header( | |
| name = "otp_ctrl_regs", | |
| srcs = [ | |
| "otp_ctrl.hjson", | |
| ], | |
| ) | |
| otp_json( | |
| name = "otp_json_creator_sw_cfg", | |
| partitions = [ | |
| otp_partition( | |
| name = "CREATOR_SW_CFG", | |
| items = { | |
| "CREATOR_SW_CFG_DIGEST": "0x0", | |
| # Use software mod_exp implementation for signature | |
| # verification. See the definition of `hardened_bool_t` in | |
| # sw/device/lib/base/hardened.h. | |
| "CREATOR_SW_CFG_SIGVERIFY_RSA_MOD_EXP_IBEX_EN": "0x739", | |
| # Mark the first three keys as valid and remaining as invalid | |
| # since we currently have only three keys. See the definition of | |
| # `hardened_byte_bool_t` in sw/device/lib/base/hardened.h. | |
| "CREATOR_SW_CFG_SIGVERIFY_RSA_KEY_EN": "0x4b4b4b4b4ba5a5a5", | |
| # Enable use of entropy for countermeasures. See the definition | |
| # of `hardened_bool_t` in sw/device/lib/base/hardened.h. | |
| "CREATOR_SW_CFG_RNG_EN": "0x739", | |
| # ROM execution is enabled if this item is set to a non-zero | |
| # value. | |
| "CREATOR_SW_CFG_ROM_EXEC_EN": "0xffffffff", | |
| # Value to write to the cpuctrl CSR in `rom_init()`. | |
| # See: | |
| # https://ibex-core.readthedocs.io/en/latest/03_reference/cs_registers.html#cpu-control-register-cpuctrl | |
| "CREATOR_SW_CFG_CPUCTRL": "0x1", | |
| "CREATOR_SW_CFG_JITTER_EN": "0x9", | |
| # Value of the min_security_version_rom_ext field of the | |
| # default boot data. | |
| "CREATOR_SW_CFG_MIN_SEC_VER_ROM_EXT": "0x0", | |
| # Value of the min_security_version_bl0 field of the default | |
| # boot data. | |
| "CREATOR_SW_CFG_MIN_SEC_VER_BL0": "0x0", | |
| # Enable the default boot data in PROD and PROD_END life cycle | |
| # states. See the definition of `hardened_bool_t` in | |
| # sw/device/lib/base/hardened.h. | |
| "CREATOR_SW_CFG_DEFAULT_BOOT_DATA_IN_PROD_EN": "0x739", | |
| # Enable AST initialization. | |
| "CREATOR_SW_CFG_AST_INIT_EN": "0x6", | |
| # TODO: This enables a busyloop in the ROM to give time to | |
| # trigger an RMA lifecycle transition via JTAG. The current | |
| # value of 10 cycles is useful for test code which verifies | |
| # the path through the ROM. This value is not useful for a | |
| # real chip. | |
| "CREATOR_SW_CFG_RMA_SPIN_EN": "0x739", | |
| "CREATOR_SW_CFG_RMA_SPIN_CYCLES": "10", | |
| # Entropy source health check default values. This needs to be | |
| # populated when `CREATOR_SW_CFG_RNG_EN` is set to true. | |
| "CREATOR_SW_CFG_RNG_REPCNT_THRESHOLDS": "0xffffffff", | |
| "CREATOR_SW_CFG_RNG_REPCNTS_THRESHOLDS": "0xffffffff", | |
| "CREATOR_SW_CFG_RNG_ADAPTP_HI_THRESHOLDS": "0xffffffff", | |
| "CREATOR_SW_CFG_RNG_ADAPTP_LO_THRESHOLDS": "0x0", | |
| "CREATOR_SW_CFG_RNG_BUCKET_THRESHOLDS": "0xffffffff", | |
| "CREATOR_SW_CFG_RNG_MARKOV_HI_THRESHOLDS": "0xffffffff", | |
| "CREATOR_SW_CFG_RNG_MARKOV_LO_THRESHOLDS": "0x0", | |
| "CREATOR_SW_CFG_RNG_EXTHT_HI_THRESHOLDS": "0xffffffff", | |
| "CREATOR_SW_CFG_RNG_EXTHT_LO_THRESHOLDS": "0x0", | |
| "CREATOR_SW_CFG_RNG_ALERT_THRESHOLD": "0xfffd0002", | |
| "CREATOR_SW_CFG_RNG_HEALTH_CONFIG_DIGEST": "0x8264cf75", | |
| }, | |
| ), | |
| ], | |
| ) | |
| otp_json( | |
| name = "otp_json_owner_sw_cfg", | |
| partitions = [ | |
| otp_partition( | |
| name = "OWNER_SW_CFG", | |
| items = { | |
| "OWNER_SW_CFG_DIGEST": "0x0", | |
| # Enable bootstrap. See `hardened_bool_t` in | |
| # sw/device/lib/base/hardened.h. | |
| "OWNER_SW_CFG_ROM_BOOTSTRAP_EN": "0x739", | |
| # Set to 0x739 to use the ROM_EXT hash measurement as the key | |
| # manager attestation binding value. | |
| "OWNER_SW_CFG_ROM_KEYMGR_ROM_EXT_MEAS_EN": "0x0", | |
| # Report errors without any redaction. | |
| "OWNER_SW_CFG_ROM_ERROR_REPORTING": "0xe2290aa5", | |
| # Set the enables to kAlertEnableNone. | |
| # See `alert_enable_t` in | |
| # sw/device/silicon_creator/lib/drivers/alert.h | |
| "OWNER_SW_CFG_ROM_ALERT_CLASS_EN": "0xa9a9a9a9", | |
| # Set the esclation policies to kAlertEscalateNone. | |
| # See `alert_escalate_t` in | |
| # sw/device/silicon_creator/lib/drivers/alert.h | |
| "OWNER_SW_CFG_ROM_ALERT_ESCALATION": "0xd1d1d1d1", | |
| # Set the classifiactions to kAlertClassX. | |
| # See `alert_class_t` in | |
| # sw/device/silicon_creator/lib/drivers/alert.h | |
| "OWNER_SW_CFG_ROM_ALERT_CLASSIFICATION": ["0x94949494"] * 80, | |
| # Set the classifiactions to kAlertClassX. See `alert_class_t` in | |
| # sw/device/silicon_creator/lib/drivers/alert.h | |
| "OWNER_SW_CFG_ROM_LOCAL_ALERT_CLASSIFICATION": ["0x94949494"] * 16, | |
| # Set the alert accumulation thresholds to 0 per class. | |
| "OWNER_SW_CFG_ROM_ALERT_ACCUM_THRESH": ["0x00000000"] * 4, | |
| # Set the alert timeout cycles to 0 per class. | |
| "OWNER_SW_CFG_ROM_ALERT_TIMEOUT_CYCLES": ["0x00000000"] * 4, | |
| # Set the alert phase cycles to 0,10,10,0xFFFFFFFF for classes | |
| # A and B, and to all zeros for classes C and D. | |
| "OWNER_SW_CFG_ROM_ALERT_PHASE_CYCLES": [ | |
| "0x0", | |
| "0xa", | |
| "0xa", | |
| "0xFFFFFFFF", | |
| "0x0", | |
| "0xa", | |
| "0xa", | |
| "0xFFFFFFFF", | |
| "0x0", | |
| "0x0", | |
| "0x0", | |
| "0x0", | |
| "0x0", | |
| "0x0", | |
| "0x0", | |
| "0x0", | |
| ], | |
| }, | |
| ), | |
| ], | |
| ) | |
| otp_json( | |
| name = "otp_json_hw_cfg", | |
| partitions = [ | |
| otp_partition( | |
| name = "HW_CFG", | |
| items = { | |
| "DEVICE_ID": "<random>", | |
| # Cryptolib and chip-level tests require access to the CSRNG | |
| # software interfaces. | |
| "EN_CSRNG_SW_APP_READ": True, | |
| # Cryptolib and chip-level tests require access to the | |
| # entropy_src FW data interface. | |
| "EN_ENTROPY_SRC_FW_READ": True, | |
| # Cryptolib and chip-level tests require access to the | |
| # entropy_src FW override interface. | |
| "EN_ENTROPY_SRC_FW_OVER": True, | |
| }, | |
| lock = True, | |
| ), | |
| ], | |
| ) | |
| # OTP LC STATE-SPECIFIC CONFIGS | |
| otp_json( | |
| name = "otp_json_raw", | |
| partitions = [ | |
| otp_partition( | |
| name = "SECRET1", | |
| items = { | |
| "FLASH_DATA_KEY_SEED": "<random>", | |
| }, | |
| lock = False, | |
| ), | |
| otp_partition( | |
| name = "LIFE_CYCLE", | |
| count = 0, | |
| state = "RAW", | |
| ), | |
| ], | |
| seed = "01931961561863975174", | |
| ) | |
| otp_json( | |
| name = "otp_json_test_unlocked0", | |
| partitions = [ | |
| otp_partition( | |
| name = "CREATOR_SW_CFG", | |
| items = { | |
| # ROM execution is enabled if this item is set to a non-zero value. | |
| "CREATOR_SW_CFG_ROM_EXEC_EN": "0xffffffff", | |
| }, | |
| ), | |
| otp_partition( | |
| name = "LIFE_CYCLE", | |
| count = 1, | |
| state = "TEST_UNLOCKED0", | |
| ), | |
| ], | |
| seed = "01931961561863975174", | |
| ) | |
| otp_json( | |
| name = "otp_json_dev", | |
| partitions = [ | |
| otp_partition( | |
| name = "SECRET0", | |
| items = { | |
| "TEST_UNLOCK_TOKEN": "<random>", | |
| "TEST_EXIT_TOKEN": "<random>", | |
| }, | |
| lock = True, | |
| ), | |
| otp_partition( | |
| name = "SECRET1", | |
| items = { | |
| "FLASH_ADDR_KEY_SEED": "<random>", | |
| "FLASH_DATA_KEY_SEED": "<random>", | |
| "SRAM_DATA_KEY_SEED": "<random>", | |
| }, | |
| lock = True, | |
| ), | |
| otp_partition( | |
| name = "SECRET2", | |
| items = { | |
| "RMA_TOKEN": "<random>", | |
| "CREATOR_ROOT_KEY_SHARE0": "<random>", | |
| "CREATOR_ROOT_KEY_SHARE1": "<random>", | |
| }, | |
| lock = False, | |
| ), | |
| otp_partition( | |
| name = "LIFE_CYCLE", | |
| count = "5", | |
| state = "DEV", | |
| ), | |
| ], | |
| seed = "94259314771464387", | |
| ) | |
| otp_json( | |
| name = "otp_json_prod", | |
| partitions = [ | |
| otp_partition( | |
| name = "SECRET0", | |
| items = { | |
| "TEST_UNLOCK_TOKEN": "<random>", | |
| "TEST_EXIT_TOKEN": "<random>", | |
| }, | |
| lock = True, | |
| ), | |
| otp_partition( | |
| name = "SECRET1", | |
| items = { | |
| "FLASH_ADDR_KEY_SEED": "<random>", | |
| "FLASH_DATA_KEY_SEED": "<random>", | |
| "SRAM_DATA_KEY_SEED": "<random>", | |
| }, | |
| lock = True, | |
| ), | |
| otp_partition( | |
| name = "SECRET2", | |
| items = { | |
| "RMA_TOKEN": "<random>", | |
| "CREATOR_ROOT_KEY_SHARE0": "<random>", | |
| "CREATOR_ROOT_KEY_SHARE1": "<random>", | |
| }, | |
| lock = False, | |
| ), | |
| otp_partition( | |
| name = "LIFE_CYCLE", | |
| count = 5, | |
| state = "PROD", | |
| ), | |
| ], | |
| seed = "14555711126514784208", | |
| ) | |
| otp_json( | |
| name = "otp_json_prod_end", | |
| partitions = [ | |
| otp_partition( | |
| name = "SECRET0", | |
| items = { | |
| "TEST_UNLOCK_TOKEN": "<random>", | |
| "TEST_EXIT_TOKEN": "<random>", | |
| }, | |
| lock = True, | |
| ), | |
| otp_partition( | |
| name = "SECRET1", | |
| items = { | |
| "FLASH_ADDR_KEY_SEED": "<random>", | |
| "FLASH_DATA_KEY_SEED": "<random>", | |
| "SRAM_DATA_KEY_SEED": "<random>", | |
| }, | |
| lock = True, | |
| ), | |
| otp_partition( | |
| name = "SECRET2", | |
| items = { | |
| "RMA_TOKEN": "<random>", | |
| "CREATOR_ROOT_KEY_SHARE0": "<random>", | |
| "CREATOR_ROOT_KEY_SHARE1": "<random>", | |
| }, | |
| lock = False, | |
| ), | |
| otp_partition( | |
| name = "LIFE_CYCLE", | |
| count = 5, | |
| state = "PROD_END", | |
| ), | |
| ], | |
| seed = "14555711126514784208", | |
| ) | |
| otp_json( | |
| name = "otp_json_rma", | |
| partitions = [ | |
| otp_partition( | |
| name = "SECRET0", | |
| items = { | |
| "TEST_UNLOCK_TOKEN": "<random>", | |
| "TEST_EXIT_TOKEN": "<random>", | |
| }, | |
| lock = True, | |
| ), | |
| otp_partition( | |
| name = "SECRET1", | |
| items = { | |
| "FLASH_ADDR_KEY_SEED": "<random>", | |
| "FLASH_DATA_KEY_SEED": "<random>", | |
| "SRAM_DATA_KEY_SEED": "<random>", | |
| }, | |
| lock = True, | |
| ), | |
| otp_partition( | |
| name = "SECRET2", | |
| items = { | |
| "RMA_TOKEN": "<random>", | |
| "CREATOR_ROOT_KEY_SHARE0": "<random>", | |
| "CREATOR_ROOT_KEY_SHARE1": "<random>", | |
| }, | |
| lock = False, | |
| ), | |
| otp_partition( | |
| name = "LIFE_CYCLE", | |
| count = 8, | |
| state = "RMA", | |
| ), | |
| ], | |
| seed = "01931961561863975174", | |
| ) | |
| # Create an overlay for the alert_handler digest. | |
| otp_alert_digest( | |
| name = "otp_json_alert_digest_cfg", | |
| otp_img = ":otp_json_owner_sw_cfg", | |
| ) | |
| otp_image( | |
| name = "img_dev", | |
| src = ":otp_json_dev", | |
| overlays = STD_OTP_OVERLAYS, | |
| ) | |
| otp_image( | |
| name = "img_prod", | |
| src = ":otp_json_prod", | |
| overlays = STD_OTP_OVERLAYS, | |
| ) | |
| otp_image( | |
| name = "img_prod_end", | |
| src = ":otp_json_prod_end", | |
| overlays = STD_OTP_OVERLAYS, | |
| ) | |
| otp_image( | |
| name = "img_raw", | |
| src = ":otp_json_raw", | |
| overlays = STD_OTP_OVERLAYS, | |
| ) | |
| otp_image( | |
| name = "img_rma", | |
| src = ":otp_json_rma", | |
| overlays = STD_OTP_OVERLAYS, | |
| ) | |
| otp_image( | |
| name = "img_test_unlocked0", | |
| src = ":otp_json_test_unlocked0", | |
| overlays = STD_OTP_OVERLAYS, | |
| ) | |
| # Create an execution-disabling overlay | |
| otp_json( | |
| name = "otp_json_exec_disabled", | |
| partitions = [ | |
| otp_partition( | |
| name = "CREATOR_SW_CFG", | |
| items = {"CREATOR_SW_CFG_ROM_EXEC_EN": "0x0"}, | |
| ), | |
| ], | |
| ) | |
| otp_image( | |
| name = "img_exec_disabled", | |
| src = ":otp_json_rma", | |
| overlays = STD_OTP_OVERLAYS + [":otp_json_exec_disabled"], | |
| ) | |
| # Create a bootstrap-disabling overlay | |
| otp_json( | |
| name = "otp_json_bootstrap_disabled", | |
| partitions = [ | |
| otp_partition( | |
| name = "OWNER_SW_CFG", | |
| items = {"OWNER_SW_CFG_ROM_BOOTSTRAP_EN": "0x1d4"}, | |
| ), | |
| ], | |
| ) | |
| otp_image( | |
| name = "img_bootstrap_disabled", | |
| src = ":otp_json_rma", | |
| overlays = STD_OTP_OVERLAYS + [":otp_json_bootstrap_disabled"], | |
| ) | |
| filegroup( | |
| name = "otp_imgs", | |
| srcs = [ | |
| ":img_dev", | |
| ":img_prod", | |
| ":img_raw", | |
| ":img_rma", | |
| ":img_test_unlocked0", | |
| ], | |
| ) | |
| pkg_files( | |
| name = "package", | |
| srcs = [":otp_imgs"], | |
| prefix = "earlgrey/otp", | |
| ) |