blob: 05130e33a6af120c9074e4ab9150026c5a5e17bd [file] [log] [blame]
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
load("//rules:opentitan.bzl", "OPENTITAN_CPU")
load("//rules:cross_platform.bzl", "dual_cc_device_library_of", "dual_cc_library", "dual_inputs")
load(
"//rules:opentitan_test.bzl",
"cw310_params",
"opentitan_functest",
"verilator_params",
)
load("//rules:otbn.bzl", "otbn_insn_count_range")
package(default_visibility = ["//visibility:public"])
cc_library(
name = "rsa_key",
hdrs = ["rsa_key.h"],
)
dual_cc_library(
name = "mod_exp_ibex",
srcs = dual_inputs(
device = ["mod_exp_ibex.c"],
host = ["mock_mod_exp_ibex.cc"],
),
hdrs = dual_inputs(
host = ["mock_mod_exp_ibex.h"],
shared = ["mod_exp_ibex.h"],
),
deps = dual_inputs(
device = [
"//sw/device/lib/base:macros",
"//sw/device/lib/base:memory",
],
host = [
"//sw/device/lib/base:global_mock",
"//sw/device/silicon_creator/testing:rom_test",
"@googletest//:gtest",
],
shared = [
":rsa_key",
"//sw/device/silicon_creator/lib:error",
],
),
)
cc_test(
name = "mod_exp_ibex_unittest",
srcs = ["mod_exp_ibex_unittest.cc"],
deps = [
dual_cc_device_library_of(":mod_exp_ibex"),
"@googletest//:gtest_main",
],
)
opentitan_functest(
name = "mod_exp_ibex_functest_hardcoded",
srcs = ["mod_exp_ibex_functest.c"],
verilator = verilator_params(
timeout = "long",
tags = [
"manual",
],
),
deps = [
":mod_exp_ibex",
"//sw/device/lib/testing/test_framework:ottf_main",
"//sw/device/silicon_creator/lib:test_main",
"//sw/device/silicon_creator/lib/base:sec_mmio",
"//sw/device/silicon_creator/lib/sigverify/sigverify_tests:sigverify_testvectors_hardcoded",
],
)
opentitan_functest(
name = "mod_exp_ibex_functest_wycheproof",
srcs = ["mod_exp_ibex_functest.c"],
cw310 = cw310_params(
timeout = "long",
),
targets = ["cw310_test_rom"], # Test set is too large to run in simulation
deps = [
":mod_exp_ibex",
"//sw/device/lib/testing/test_framework:ottf_main",
"//sw/device/silicon_creator/lib:test_main",
"//sw/device/silicon_creator/lib/base:sec_mmio",
"//sw/device/silicon_creator/lib/sigverify/sigverify_tests:sigverify_testvectors_wycheproof",
],
)
dual_cc_library(
name = "mod_exp_otbn",
srcs = dual_inputs(
device = ["mod_exp_otbn.c"],
host = ["mock_mod_exp_otbn.cc"],
),
hdrs = dual_inputs(
host = ["mock_mod_exp_otbn.h"],
shared = ["mod_exp_otbn.h"],
),
target_compatible_with = dual_inputs(
# This target uses OTBN pointers internally, so it cannot
# work host-side.
device = [OPENTITAN_CPU],
),
deps = dual_inputs(
device = [
"//sw/device/lib/base:macros",
"//sw/device/lib/base:memory",
"//sw/device/silicon_creator/lib/drivers:otbn",
"//sw/otbn/crypto:run_rsa_verify_3072_rr_modexp",
],
host = [
"//sw/device/lib/base:global_mock",
"//sw/device/silicon_creator/testing:rom_test",
"@googletest//:gtest",
],
shared = [
":rsa_key",
"//sw/device/silicon_creator/lib:error",
],
),
)
opentitan_functest(
name = "mod_exp_otbn_functest_hardcoded",
srcs = ["mod_exp_otbn_functest.c"],
verilator = verilator_params(
timeout = "long",
tags = [
"manual",
],
),
deps = [
":mod_exp_otbn",
"//sw/device/lib/testing/test_framework:ottf_main",
"//sw/device/silicon_creator/lib:test_main",
"//sw/device/silicon_creator/lib/base:sec_mmio",
"//sw/device/silicon_creator/lib/sigverify/sigverify_tests:sigverify_testvectors_hardcoded",
],
)
opentitan_functest(
name = "mod_exp_otbn_functest_wycheproof",
srcs = ["mod_exp_otbn_functest.c"],
targets = [
"cw310_test_rom",
"verilator",
"dv",
],
verilator = verilator_params(
timeout = "long",
tags = [
"manual",
],
),
deps = [
":mod_exp_otbn",
"//sw/device/lib/testing/test_framework:ottf_main",
"//sw/device/silicon_creator/lib:test_main",
"//sw/device/silicon_creator/lib/base:sec_mmio",
"//sw/device/silicon_creator/lib/sigverify/sigverify_tests:sigverify_testvectors_wycheproof",
],
)
# This rule runs the instruction-counting script for OTBN and gets the expected
# min/max instruction counts.
otbn_insn_count_range(
name = "mod_exp_otbn_insn_count_range",
deps = [
"//sw/otbn/crypto:run_rsa_verify_3072_rr_modexp",
],
)
# Check the OTBN instruction count in mod_exp_otbn.h
sh_test(
name = "mod_exp_otbn_insn_count_check",
size = "small",
srcs = ["mod_exp_otbn_insn_count_check.sh"],
args = [
"$(location :mod_exp_otbn_insn_count_range)",
"$(location mod_exp_otbn.h)",
],
data = [
"mod_exp_otbn.h",
":mod_exp_otbn_insn_count_range",
],
)
# Common inputs for sigverify.c; we publish two variants of this
# library, so factoring this out simplifies the build.
cc_library(
name = "sigverify_inner",
srcs = ["sigverify.c"],
hdrs = ["sigverify.h"],
visibility = ["//visibility:private"],
deps = [
":mod_exp_ibex",
":mod_exp_otbn",
":rsa_key",
"//hw/ip/otp_ctrl/data:otp_ctrl_regs",
"//hw/top_earlgrey/sw/autogen:top_earlgrey",
"//sw/device/lib/base:bitfield",
"//sw/device/lib/base:hardened",
"//sw/device/lib/base:macros",
"//sw/device/lib/base:memory",
"//sw/device/silicon_creator/lib:manifest",
"//sw/device/silicon_creator/lib/drivers:hmac",
"//sw/device/silicon_creator/lib/drivers:lifecycle",
"//sw/device/silicon_creator/lib/drivers:otp",
],
)
cc_library(
name = "sigverify",
deps = [
":mod_exp_ibex",
":mod_exp_otbn",
":sigverify_inner",
],
)
cc_library(
name = "sigverify_without_mock_mod_exp_ibex",
visibility = [
"//sw/device/silicon_creator/rom:__pkg__",
"//sw/device/silicon_creator/rom_ext:__pkg__",
],
deps = [
dual_cc_device_library_of(":mod_exp_ibex"),
":mod_exp_otbn",
":sigverify_inner",
],
)
cc_test(
name = "sigverify_unittest",
srcs = ["sigverify_unittest.cc"],
deps = [
":sigverify",
"//hw/top_earlgrey/ip/flash_ctrl/data/autogen:flash_ctrl_regs",
"//sw/device/silicon_creator/testing:rom_test",
"@googletest//:gtest_main",
],
)
opentitan_functest(
name = "sigverify_functest",
srcs = ["sigverify_functest.c"],
verilator = verilator_params(
timeout = "long",
tags = [
"manual",
],
),
deps = [
":sigverify",
"//sw/device/lib/testing/test_framework:ottf_main",
"//sw/device/silicon_creator/lib:test_main",
"//sw/device/silicon_creator/lib/base:sec_mmio",
],
)
opentitan_functest(
name = "sigverify_dynamic_functest_hardcoded",
srcs = ["sigverify_dynamic_functest.c"],
verilator = verilator_params(
timeout = "long",
tags = [
"manual",
],
),
deps = [
":sigverify",
"//sw/device/lib/testing/test_framework:ottf_main",
"//sw/device/silicon_creator/lib:test_main",
"//sw/device/silicon_creator/lib/base:sec_mmio",
"//sw/device/silicon_creator/lib/sigverify/sigverify_tests:sigverify_testvectors_hardcoded",
],
)
opentitan_functest(
name = "sigverify_dynamic_functest_wycheproof",
srcs = ["sigverify_dynamic_functest.c"],
cw310 = cw310_params(
timeout = "long",
),
targets = ["cw310_test_rom"], # Test set is too large to run in simulation
deps = [
":sigverify",
"//sw/device/lib/testing/test_framework:ottf_main",
"//sw/device/silicon_creator/lib:test_main",
"//sw/device/silicon_creator/lib/base:sec_mmio",
"//sw/device/silicon_creator/lib/sigverify/sigverify_tests:sigverify_testvectors_wycheproof",
],
)