//asylo/bazel:asylo.bzl

backend_sign_enclave_with_untrusted_key

backend_sign_enclave_with_untrusted_key(name, backend, unsigned, config, backend_label_struct, kwargs)

Defines the ‘signed’ version of an unsigned enclave target.

The signer is backend-specific.

Parameters

name required.

The rule name.

backend required.

An Asylo backend label.

unsigned required.

The label of the unsigned enclave target.

config optional. default is None

An enclave signer configuration label. Optional.

backend_label_struct optional. default is None

Optional backend label struct (details in enclave_info.bzl)

kwargs optional.

Generic rule arguments like tags and testonly.

cc_backend_unsigned_enclave

cc_backend_unsigned_enclave(name, backend, kwargs)

Defines a C++ unsigned enclave target in the provided backend.

Parameters

name required.

The rule name.

backend required.

An Asylo backend label.

kwargs optional.

Arguments to cc_binary.

cc_backend_unsigned_enclave_experimental

cc_backend_unsigned_enclave_experimental(name, backend, kwargs)

Defines a C++ unsigned enclave target in the provided backend.

Parameters

name required.

The rule name.

backend required.

An Asylo backend label.

kwargs optional.

Arguments to cc_binary.

cc_enclave_binary

cc_enclave_binary(name, application_enclave_config, enclave_build_config, application_library_linkstatic, backends, unsigned_name_by_backend, signed_name_by_backend, testonly, kwargs)

Creates a cc_binary that runs an application inside an enclave.

Mostly compatible with the cc_binary interface. The following options are not supported:

  • linkshared
  • malloc
  • stamp

Usage of unsupported aspects of the cc_binary interface will result in build failures.

fork() inside Asylo is enabled by default in this rule.

Parameters

name required.

Name for the build target.

application_enclave_config optional. default is ""

A target that defines a function called ApplicationConfig() returning and EnclaveConfig. The returned config is passed to the application enclave. Optional.

enclave_build_config optional. default is ""

A backend-specific configuration target to be passed to the enclave signer. Optional.

application_library_linkstatic optional. default is True

When building the application as a library, whether to allow that library to be statically linked. See the `linkstatic` option on `cc_library`. Optional.

backends optional. default is {"@linux_sgx//:asylo_sgx_hw": struct(config_settings = ["@linux_sgx//:sgx_hw"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_hw", order = 2, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-hw", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>), "@linux_sgx//:asylo_sgx_sim": struct(config_settings = ["@linux_sgx//:sgx_sim"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_sim", order = 1, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-sim", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>)}

The asylo backend labels the binary uses. Must specify at least one. Defaults to all supported backends. If more than one, then name is an alias to a select on backend value to backend-specialized targets. See enclave_info.bzl:all_backends documentation for details.

unsigned_name_by_backend optional. default is {}

An optional dictionary from backend label to backend- specific target label for the defined unsigned enclaves.

signed_name_by_backend optional. default is {}

An optional dictionary from backend label to backend- specific target label for the defined signed enclaves.

testonly optional. default is 0

True if the targets should only be used in tests.

kwargs optional.

cc_binary arguments.

cc_enclave_test

cc_enclave_test(name, srcs, enclave_config, remote_proxy, tags, deps, test_in_initialize, backends, unsigned_name_by_backend, signed_name_by_backend, test_name_by_backend, kwargs)

Build target that runs a cc_test srcs inside of an enclave.

This macro creates two targets, one sign_enclave_with_untrusted_key target with the test source. And another test runner application to launch the test enclave.

Parameters

name required.

Target name for will be <name>_enclave.

srcs required.

Same as cc_test srcs.

enclave_config optional. default is ""

A backend-specific configuration target to be passed to the signer for each backend. Optional.

remote_proxy optional. default is None

Host-side executable that is going to run remote enclave proxy server which will actually load the enclave(s). If empty, the enclave(s) are loaded locally.

tags optional. default is []

Same as cc_test tags.

deps optional. default is []

Same as cc_test deps.

test_in_initialize optional. default is False

If True, tests run in Initialize, rather than Run. This allows us to ensure the initialization and post-initialization execution environments provide the same runtime behavior and semantics.

backends optional. default is {"@linux_sgx//:asylo_sgx_hw": struct(config_settings = ["@linux_sgx//:sgx_hw"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_hw", order = 2, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-hw", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>), "@linux_sgx//:asylo_sgx_sim": struct(config_settings = ["@linux_sgx//:sgx_sim"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_sim", order = 1, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-sim", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>)}

The asylo backend labels the binary uses. Must specify at least one. Defaults to all supported backends. If more than one, then name is an alias to a select on backend value to backend-specialized targets. See enclave_info.bzl:all_backends documentation for details.

unsigned_name_by_backend optional. default is {}

An optional dictionary from backend label to backend- specific target label for the defined unsigned enclaves.

signed_name_by_backend optional. default is {}

An optional dictionary from backend label to backend- specific target label for the defined signed enclaves.

test_name_by_backend optional. default is {}

An optional dictionary from backend label to backend-specific name for the test target.

kwargs optional.

cc_test arguments.

cc_test

cc_test(name, enclave_test_name, enclave_test_unsigned_name_by_backend, enclave_test_signed_name_by_backend, enclave_test_config, srcs, deps, backends, kwargs)

Build macro that creates a cc_test target and a cc_enclave_test target.

This macro generates a cc_test target, which will run a gtest test suite normally, and optionally a cc_enclave_test, which will run the test suite inside of an enclave.

Parameters

name required.

Same as native cc_test name.

enclave_test_name optional. default is ""

Name for the generated cc_enclave_test. Optional.

enclave_test_unsigned_name_by_backend optional. default is {}

Dictionary of backend label to test name for backend-specific unsigned enclave targets generated by cc_enclave_test. Optional.

enclave_test_signed_name_by_backend optional. default is {}

Dictionary of backend label to test name for backend-specific signed enclave targets generated by cc_enclave_test. Optional.

enclave_test_config optional. default is ""

A backend-specific configuration target to be passed to the enclave signer for each backend. Optional.

srcs optional. default is []

Same as native cc_test srcs.

deps optional. default is []

Same as native cc_test deps.

backends optional. default is {"@linux_sgx//:asylo_sgx_hw": struct(config_settings = ["@linux_sgx//:sgx_hw"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_hw", order = 2, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-hw", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>), "@linux_sgx//:asylo_sgx_sim": struct(config_settings = ["@linux_sgx//:sgx_sim"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_sim", order = 1, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-sim", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>)}

The asylo backend labels the binary uses. Must specify at least one. Defaults to all supported backends. If more than one, then name is an alias to a select on backend value to backend-specialized targets. See enclave_info.bzl:all_backends documentation for details.

kwargs optional.

cc_test arguments.

cc_test_and_cc_enclave_test

cc_test_and_cc_enclave_test(name, enclave_test_name, enclave_test_config, srcs, deps, backends, kwargs)

An alias for cc_test with a default enclave_test_name.

This macro is identical to cc_test, except it passes in an enclave test name automatically. It is provided for convenience of overriding the default definition of cc_test without having to specify enclave test names. If this behavior is not desired, use cc_test instead, which will not create and enclave test unless given an enclave test name.

This is most useful if imported as load( “//asylo/bazel:asylo.bzl”, cc_test = “cc_test_and_cc_enclave_test”, ) so any cc_test defined in the BUILD file will generate both native and enclave tests.

Parameters

name required.

See documentation for name in native cc_test rule.

enclave_test_name optional. default is ""

See documentation for enclave_test_name in cc_test above. If not provided and name ends with "_test", then defaults to name with "_test" replaced with "_enclave_test". If not provided and name does not end with "_test", then defaults to name appended with "_enclave".

enclave_test_config optional. default is ""

A backend-specific configuration target to be passed to the signer. Optional.

srcs optional. default is []

See documentation for srcs in native cc_test rule.

deps optional. default is []

See documentation for deps in native cc_test rule.

backends optional. default is {"@linux_sgx//:asylo_sgx_hw": struct(config_settings = ["@linux_sgx//:sgx_hw"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_hw", order = 2, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-hw", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>), "@linux_sgx//:asylo_sgx_sim": struct(config_settings = ["@linux_sgx//:sgx_sim"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_sim", order = 1, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-sim", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>)}

The asylo backend labels the binary uses. Must specify at least one. Defaults to all supported backends. If more than one, then name is an alias to a select on backend value to backend-specialized targets. See enclave_info.bzl:all_backends documentation for details.

kwargs optional.

See documentation for **kwargs in native cc_test rule.

cc_unsigned_enclave

cc_unsigned_enclave(name, backends, name_by_backend, kwargs)

Creates a C++ unsigned enclave target in all or any backend.

Parameters

name required.

The rule name.

backends optional. default is {"@linux_sgx//:asylo_sgx_hw": struct(config_settings = ["@linux_sgx//:sgx_hw"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_hw", order = 2, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-hw", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>), "@linux_sgx//:asylo_sgx_sim": struct(config_settings = ["@linux_sgx//:sgx_sim"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_sim", order = 1, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-sim", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>)}

The asylo backend labels the binary uses. Must specify at least one. Defaults to all supported backends. If more than one, then name is an alias to a select on backend value to backend-specialized targets. See enclave_info.bzl:all_backends documentation for details.

name_by_backend optional. default is {}

An optional dictionary from backend label to backend- specific target label.

kwargs optional.

Remainder arguments to the backend rule.

debug_sign_enclave

debug_sign_enclave(name, kwargs)

Alias for sign_enclave_with_untrusted_key.

Parameters

name required.

The rule name,

kwargs optional.

The rest of the arguments to sign_enclave_with_untrusted_key.

dlopen_enclave_loader

dlopen_enclave_loader(name, enclaves, embedded_enclaves, loader_args, remote_proxy, kwargs)

Thin wrapper around enclave loader, adds necessary linkopts and testonly=1

Parameters

name required.

Name for build target.

enclaves optional. default is {}

Dictionary from enclave names to target dependencies. The dictionary must be injective. This dictionary is used to format each string in `loader_args` after each enclave target is interpreted as the path to its output binary.

embedded_enclaves optional. default is {}

Dictionary from ELF section names (that do not start with '.') to target dependencies. Each target in the dictionary is embedded in the loader binary under the corresponding ELF section.

loader_args optional. default is []

List of arguments to be passed to `loader`. Arguments may contain {enclave_name}-style references to keys from the `enclaves` dict, each of which will be replaced with the path to the named enclave.

remote_proxy optional. default is None

Host-side executable that is going to run remote enclave proxy server which will actually load the enclave(s). If empty, the enclave(s) are loaded locally.

kwargs optional.

cc_binary arguments.

dlopen_enclave_test

dlopen_enclave_test(name, kwargs)

Thin wrapper around enclave test, adds ‘asylo-dlopen’ tag and necessary linkopts

Parameters

name required.

enclave_test name

kwargs optional.

same as enclave_test kwargs

embed_enclaves

embed_enclaves(name, elf_file, enclaves, kwargs)

Build rule for embedding one or more enclaves into an ELF file.

Each enclave is embedded in a new ELF section that does not get loaded into memory automatically when the elf file is run.

If the original binary already has a section with the same name as one of the given section names, objcopy (and the bazel invocation) will fail with an error message stating that the file is in the wrong format.

Parameters

name required.

The name of a new ELF file containing the contents of the original ELF file and the embedded enclaves.

elf_file required.

The ELF file to embed the enclaves in. This target is built with the host toolchain.

enclaves required.

A dictionary from new ELF section names to the enclave files that should be embedded in those sections. The section names may not start with ".", since section names starting with "." are reserved for the system.

kwargs optional.

genrule arguments.

enclave_build_test

enclave_build_test(name, enclaves, tags, name_by_backend, backends)

Tests that the given enclaves build in the specified backends.

Parameters

name required.

The rule name and base name for backend-specific name derivations.

enclaves optional. default is []

A list of enclave labels.

tags optional. default is []

Tags to apply to the test targets.

name_by_backend optional. default is {}

An optional dictionary from backend label to backend- specific test name.

backends optional. default is {"@linux_sgx//:asylo_sgx_hw": struct(config_settings = ["@linux_sgx//:sgx_hw"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_hw", order = 2, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-hw", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>), "@linux_sgx//:asylo_sgx_sim": struct(config_settings = ["@linux_sgx//:sgx_sim"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_sim", order = 1, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-sim", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>)}

A list of Asylo backend labels.

enclave_loader

enclave_loader(name, enclaves, embedded_enclaves, loader_args, remote_proxy, backends, loader_name_by_backend, name_by_backend, deprecation, kwargs)

Wraps a cc_binary with a dependency on enclave availability at runtime.

Creates a loader for the given enclaves and containing the given embedded enclaves. Passes flags according to loader_args, which can contain references to targets from enclaves.

The loader is subject to a backend transition by the specified backends.

This macro creates three build targets: 1) name: shell script that runs name_host_loader. 2) name_loader: cc_binary used as loader in name. This is a normal cc_binary. It cannot be directly run because there is an undeclared dependency on the enclaves. 3) name_host_loader: genrule that builds name_loader with the host crosstool.

Parameters

name required.

Name for build target.

enclaves optional. default is {}

Dictionary from enclave names to target dependencies. The dictionary must be injective. This dictionary is used to format each string in `loader_args` after each enclave target is interpreted as the path to its output binary. Enclaves are built under a backend transition.

embedded_enclaves optional. default is {}

Dictionary from ELF section names (that do not start with '.') to target dependencies. Each target in the dictionary is embedded in the loader binary under the corresponding ELF section.

loader_args optional. default is []

List of arguments to be passed to `loader`. Arguments may contain {enclave_name}-style references to keys from the `enclaves` dict, each of which will be replaced with the path to the named enclave.

remote_proxy optional. default is None

Host-side executable that is going to run remote enclave proxy server which will actually load the enclave(s). If empty, the enclave(s) are loaded locally.

backends optional. default is {"@linux_sgx//:asylo_sgx_hw": struct(config_settings = ["@linux_sgx//:sgx_hw"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_hw", order = 2, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-hw", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>), "@linux_sgx//:asylo_sgx_sim": struct(config_settings = ["@linux_sgx//:sgx_sim"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_sim", order = 1, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-sim", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>)}

The asylo backend labels the binary uses. Must specify at least one. Defaults to all supported backends. If more than one, then name is an alias to a select on backend value to backend-specialized targets. See enclave_info.bzl:all_backends documentation for details.

loader_name_by_backend optional. default is {}

Dictionary of backend label to loader name for backend-specific enclave driver. Optional.

name_by_backend optional. default is {}

An optional dictionary from backend label to backend- specific loader script name.

deprecation optional. default is None

A string deprecation message for uses of this macro that have been marked deprecated. Optional.

kwargs optional.

cc_binary arguments.

enclave_test

enclave_test(name, enclaves, embedded_enclaves, test_args, remote_proxy, backend_dependent_data, tags, backends, loader_name_by_backend, test_name_by_backend, deprecation, kwargs)

Build target for testing one or more enclaves.

Creates a cc_test for a given enclave. Passes flags according to test_args, which can contain references to targets from enclaves.

This macro creates three build targets: 1) name: sh_test that runs the enclave_test. 2) name_driver: cc_test used as test loader in name. This is a normal cc_test. It cannot be directly run because there is an undeclared dependency on enclave. 3) name_host_driver: genrule that builds name_driver with host crosstool.

Parameters

name required.

Name for build target.

enclaves optional. default is {}

Dictionary from enclave names to target dependencies. The dictionary must be injective. This dictionary is used to format each string in `test_args` after each enclave target is interpreted as the path to its output binary.

embedded_enclaves optional. default is {}

Dictionary from ELF section names (that do not start with '.') to target dependencies. Each target in the dictionary is embedded in the test binary under the corresponding ELF section.

test_args optional. default is []

List of arguments to be passed to the test binary. Arguments may contain {enclave_name}-style references to keys from the `enclaves` dict, each of which will be replaced with the path to the named enclave. This replacement only occurs for non-embedded enclaves.

remote_proxy optional. default is None

Host-side executable that is going to run remote enclave proxy server which will actually load the enclave(s). If empty, the enclave(s) are loaded locally.

backend_dependent_data optional. default is []
tags optional. default is []

Label attached to this test to allow for querying.

backends optional. default is {"@linux_sgx//:asylo_sgx_hw": struct(config_settings = ["@linux_sgx//:sgx_hw"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_hw", order = 2, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-hw", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>), "@linux_sgx//:asylo_sgx_sim": struct(config_settings = ["@linux_sgx//:sgx_sim"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_sim", order = 1, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-sim", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>)}

The asylo backend labels the binary uses. Must specify at least one. Defaults to all supported backends. If more than one, then name is an alias to a select on backend value to backend-specialized targets. See enclave_info.bzl:all_backends documentation for details.

loader_name_by_backend optional. default is {}
test_name_by_backend optional. default is {}
deprecation optional. default is None

A string deprecation message for uses of this macro that have been marked deprecated. Optional.

kwargs optional.

cc_test arguments.

sgx_enclave_test

sgx_enclave_test(name, srcs, kwargs)

Build target for testing one or more instances of ‘sign_enclave_with_untrusted_key’.

This macro invokes enclave_test with the “asylo-sgx” tag added.

Parameters

name required.

The target name.

srcs required.

Same as cc_test srcs.

kwargs optional.

enclave_test arguments.

sign_enclave_with_untrusted_key

sign_enclave_with_untrusted_key(name, unsigned, key, backends, config, testonly, name_by_backend, visibility)

Signs an unsigned enclave according the the backend’s signing procedure.

Parameters

name required.

The signed enclave target name.

unsigned required.

The label to the unsigned enclave.

key optional. default is None

The untrusted private key for signing. Default value is defined by the backend.

backends optional. default is {"@linux_sgx//:asylo_sgx_hw": struct(config_settings = ["@linux_sgx//:sgx_hw"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_hw", order = 2, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-hw", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>), "@linux_sgx//:asylo_sgx_sim": struct(config_settings = ["@linux_sgx//:sgx_sim"], debug_default_config = "@linux_sgx//:enclave_debug_config", debug_private_key = "@linux_sgx//:enclave_test_private.pem", name_derivation = "_sgx_sim", order = 1, sign_tool = "@linux_sgx//:sgx_sign_tool", tags = ["asylo-sgx-sim", "manual"], transitive_features_transform = <function _lvi_all_loads_to_features>)}

The asylo backend labels the binary uses. Must specify at least one. Defaults to all supported backends. If more than one, then name is an alias to a select on backend value to backend-specialized targets. See enclave_info.bzl:all_backends documentation for details.

config optional. default is None

A label to a config target that the backend-specific signing tool uses.

testonly optional. default is 0

True if the target should only be used in tests.

name_by_backend optional. default is {}

An optional dictionary from backend label to backend- specific target label.

visibility optional. default is None

Optional target visibility.