blob: 9188819a8c380988ade683f778b80e4beb5313fa [file] [log] [blame]
// Copyright 2023, The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Rust bindgen wrappers to allow calling into libavb from Rust.
//
// The auto-generated wrappers are Rust unsafe and somewhat difficult to work
// with so are not exposed outside of this directory; instead we will provide
// a safe higher-level Rust API.
rust_defaults {
name: "libavb_bindgen.common.defaults",
wrapper_src: "bindgen/avb.h",
crate_name: "avb_bindgen",
edition: "2021",
visibility: [
":__subpackages__",
// TODO(b/290110273): add the Rust public API layer here and adjust
// Virtualization packages to depend on it instead of the raw bindgen.
"//packages/modules/Virtualization:__subpackages__",
],
source_stem: "bindings",
bindgen_flags: [
"--constified-enum-module=AvbDescriptorTag",
"--bitfield-enum=Avb.*Flags",
"--default-enum-style rust",
"--with-derive-default",
"--with-derive-custom=Avb.*Descriptor=FromZeroes,FromBytes",
"--with-derive-custom=AvbCertPermanentAttributes=FromZeroes,FromBytes,AsBytes",
"--with-derive-custom=AvbCertCertificate.*=FromZeroes,FromBytes,AsBytes",
"--with-derive-custom=AvbCertUnlock.*=FromZeroes,FromBytes,AsBytes",
"--allowlist-type=AvbDescriptorTag",
"--allowlist-type=Avb.*Flags",
"--allowlist-function=.*",
"--allowlist-var=AVB.*",
"--use-core",
"--raw-line=#![no_std]",
"--raw-line=use zerocopy::{AsBytes, FromBytes, FromZeroes};",
"--ctypes-prefix=core::ffi",
],
cflags: ["-DBORINGSSL_NO_CXX"],
}
// Full bindgen defaults for std targets.
rust_defaults {
name: "libavb_bindgen.std.defaults",
defaults: ["libavb_bindgen.common.defaults"],
host_supported: true,
static_libs: ["libavb_cert"],
shared_libs: ["libcrypto"],
rustlibs: ["libzerocopy"],
apex_available: ["com.android.virt"],
}
// Full bindgen default for nostd targets.
rust_defaults {
name: "libavb_bindgen.nostd.defaults",
defaults: ["libavb_bindgen.common.defaults"],
static_libs: [
"libavb_cert_baremetal",
"libcrypto_baremetal",
],
rustlibs: ["libzerocopy_nostd_noalloc"],
}
// Internal source-only bindgen with std.
//
// This target should only be used as `srcs`, not `rustlibs` or `rlibs`. This
// is because the `rust_bindgen` rule intentionally only generates rlibs
// (b/166332519), and also forces its dependencies to use rlibs. However, this
// can create mismatched library types if the depenency is also used elsewhere
// in a build rule as a dylib. In particular for us, libzerocopy and its own
// dependency libbyteorder trigger this problem like so:
//
// build target (prefer dylib)
// / \
// libavb_rs (dylib) \
// / \
// libavb_bindgen (rlib) ... arbitrary dependency chain (dylib) ...
// / \
// libzerocopy (rlib) \
// / \
// libbyteorder (rlib) libbyteorder (dylib)
//
// By using it as a `srcs` instead, we can wrap it in a `rust_library` which
// allows selecting either library type and fixes the conflict:
//
// build target (prefer dylib)
// / \
// libavb_rs (dylib) \
// / \
// libavb_bindgen (dylib) ... arbitrary dependency chain (dylib) ...
// / /
// libzerocopy (dylib) /
// \ /
// libbyteorder (dylib)
//
rust_bindgen {
name: "libavb_bindgen_for_srcs_only",
defaults: ["libavb_bindgen.std.defaults"],
}
// Bindgen with std.
//
// See above for why we need a `rust_library` wrapper here.
rust_library {
name: "libavb_bindgen",
defaults: ["libavb_bindgen.std.defaults"],
srcs: [":libavb_bindgen_for_srcs_only"],
}
// Bindgen nostd.
//
// Nostd targets always use rlibs, so we don't need a `rust_library` wrapper in
// this case; the rlib-only bindgen target is sufficient.
rust_bindgen {
name: "libavb_bindgen_nostd",
defaults: ["libavb_bindgen.nostd.defaults"],
}
// Bindgen auto-generated tests.
rust_test {
name: "libavb_bindgen_test",
srcs: [":libavb_bindgen_for_srcs_only"],
crate_name: "avb_bindgen_test",
edition: "2021",
test_suites: ["general-tests"],
auto_gen_config: true,
clippy_lints: "none",
lints: "none",
rustlibs: ["libzerocopy"],
}
// Rust library wrapping libavb C implementation.
// Common defaults for all variations.
rust_defaults {
name: "libavb_rs_common.defaults",
crate_name: "avb",
srcs: ["src/lib.rs"],
clippy_lints: "android",
lints: "android",
}
// No std, no features.
rust_defaults {
name: "libavb_rs_nostd.defaults",
defaults: ["libavb_rs_common.defaults"],
// Only rlib can build without the required nostd hooks (eh_personality,
// panic_handler, etc) to defer them for the final binary to implement.
prefer_rlib: true,
no_stdlibs: true,
rustlibs: [
"libavb_bindgen_nostd",
"libzerocopy_nostd_noalloc",
],
whole_static_libs: [
"libavb_cert_baremetal",
],
stdlibs: [
"libcore.rust_sysroot",
],
}
// Std, no features.
rust_defaults {
name: "libavb_rs.defaults",
defaults: ["libavb_rs_common.defaults"],
host_supported: true,
rustlibs: [
"libavb_bindgen",
"libzerocopy",
],
whole_static_libs: [
"libavb_cert",
],
}
// Adds UUID feature for nostd.
rust_defaults {
name: "libavb_rs_nostd.uuid.defaults",
features: [
"uuid",
],
rustlibs: [
"libuuid_nostd",
],
}
// Adds UUID feature for std.
rust_defaults {
name: "libavb_rs.uuid.defaults",
features: [
"uuid",
],
rustlibs: [
"libuuid",
],
}
// lib: no std, no features.
rust_library_rlib {
name: "libavb_rs_nostd",
defaults: ["libavb_rs_nostd.defaults"],
}
// lib: no std, UUID feature.
rust_library_rlib {
name: "libavb_rs_nostd_uuid",
defaults: [
"libavb_rs_nostd.defaults",
"libavb_rs_nostd.uuid.defaults",
],
}
// lib: std, no features.
rust_library {
name: "libavb_rs",
defaults: ["libavb_rs.defaults"],
}
// lib: std, UUID feature.
rust_library {
name: "libavb_rs_uuid",
defaults: [
"libavb_rs.defaults",
"libavb_rs.uuid.defaults",
],
}
// TestOps lib: std
rust_library {
crate_name: "avb_test",
name: "libavb_test_rs_testops",
srcs: ["tests/test_ops.rs"],
clippy_lints: "android",
lints: "android",
host_supported: true,
rustlibs: [
"libavb_rs",
],
whole_static_libs: [
"libavb_cert",
],
}
// "libavb_rs.defaults" plus additional unit test defaults.
rust_defaults {
name: "libavb_rs_unittest.defaults",
defaults: ["libavb_rs.defaults"],
data: [":libavb_rs_example_descriptors"],
test_suites: ["general-tests"],
}
// Unit tests: std, no features.
rust_test {
name: "libavb_rs_unittest",
defaults: ["libavb_rs_unittest.defaults"],
}
// Unit tests: std, UUID feature.
rust_test {
name: "libavb_rs_uuid_unittest",
defaults: [
"libavb_rs_unittest.defaults",
"libavb_rs.uuid.defaults",
],
}
// Example descriptors in binary format.
filegroup {
name: "libavb_rs_example_descriptors",
srcs: [
"testdata/chain_partition_descriptor.bin",
"testdata/hash_descriptor.bin",
"testdata/hashtree_descriptor.bin",
"testdata/kernel_commandline_descriptor.bin",
"testdata/property_descriptor.bin",
],
}
// Integration test defaults.
rust_defaults {
name: "libavb_rs_test.defaults",
srcs: ["tests/tests.rs"],
data: [
":avb_cert_test_permanent_attributes",
":avb_cert_test_unlock_challenge",
":avb_cert_test_unlock_credential",
":avb_testkey_rsa4096_pub_bin",
":avb_testkey_rsa8192_pub_bin",
":avbrs_test_image",
":avbrs_test_image_with_vbmeta_footer",
":avbrs_test_image_with_vbmeta_footer_for_boot",
":avbrs_test_image_with_vbmeta_footer_for_test_part_2",
":avbrs_test_vbmeta",
":avbrs_test_vbmeta_2_parts",
":avbrs_test_vbmeta_cert",
":avbrs_test_vbmeta_persistent_digest",
":avbrs_test_vbmeta_with_chained_partition",
":avbrs_test_vbmeta_with_commandline",
":avbrs_test_vbmeta_with_hashtree",
":avbrs_test_vbmeta_with_property",
],
rustlibs: [
"libhex",
"libzerocopy",
],
test_suites: ["general-tests"],
clippy_lints: "android",
lints: "android",
}
// Integration test: no features.
rust_test {
name: "libavb_rs_test",
defaults: ["libavb_rs_test.defaults"],
rustlibs: ["libavb_rs"],
}
// Integration test: UUID feature.
rust_test {
name: "libavb_rs_uuid_test",
defaults: [
"libavb_rs.uuid.defaults",
"libavb_rs_test.defaults",
],
rustlibs: ["libavb_rs_uuid"],
}
// Test images for verification.
// Unsigned 16KiB test image.
genrule {
name: "avbrs_test_image",
tools: ["avbtool"],
out: ["test_image.img"],
cmd: "$(location avbtool) generate_test_image --image_size 16384 --output $(out)",
}
// Unsigned vbmeta blob containing the test image descriptor for partition name "test_part".
avb_gen_vbmeta_image {
name: "avbrs_test_image_descriptor",
src: ":avbrs_test_image",
partition_name: "test_part",
salt: "1000",
}
// Unsigned vbmeta blob containing the test image descriptor for partition name "test_part_2".
avb_gen_vbmeta_image {
name: "avbrs_test_image_descriptor_2",
src: ":avbrs_test_image",
partition_name: "test_part_2",
salt: "1001",
}
// Unsigned vbmeta blob containing a persistent digest descriptor for partition name
// "test_part_persistent_digest".
//
// Currently this is the only in-tree usage of persistent digests, but if anyone else needs it
// later on it may be worth folding support for this into the `avb_gen_vbmeta_image` rule.
genrule {
name: "avbrs_test_image_descriptor_persistent_digest",
tools: ["avbtool"],
srcs: [":avbrs_test_image"],
out: ["avbrs_test_image_descriptor_persistent_digest.img"],
cmd: "$(location avbtool) add_hash_footer --image $(location :avbrs_test_image) --partition_name test_part_persistent_digest --dynamic_partition_size --do_not_append_vbmeta_image --use_persistent_digest --output_vbmeta_image $(out)",
}
// Unsigned vbmeta blob containing a hastree descriptor for partition name
// "test_part_hashtree".
genrule {
name: "avbrs_test_image_descriptor_hashtree",
tools: ["avbtool"],
srcs: [":avbrs_test_image"],
out: ["avbrs_test_image_descriptor_hashtree.img"],
// Generating FEC values requires the `fec` tool to be on $PATH, which does
// not seems to be possible here. For now pass `--do_not_generate_fec`.
cmd: "$(location avbtool) add_hashtree_footer --image $(location :avbrs_test_image) --partition_name test_part_hashtree --partition_size 0 --salt B000 --do_not_append_vbmeta_image --output_vbmeta_image $(out) --do_not_generate_fec",
}
// Standalone vbmeta image signing the test image descriptor.
genrule {
name: "avbrs_test_vbmeta",
tools: ["avbtool"],
srcs: [
":avbrs_test_image_descriptor",
":avb_testkey_rsa4096",
],
out: ["test_vbmeta.img"],
cmd: "$(location avbtool) make_vbmeta_image --key $(location :avb_testkey_rsa4096) --algorithm SHA512_RSA4096 --include_descriptors_from_image $(location :avbrs_test_image_descriptor) --output $(out)",
}
// Standalone vbmeta image signing the test image descriptor with
// `avb_cert_testkey_psk` and `avb_cert_test_metadata`.
genrule {
name: "avbrs_test_vbmeta_cert",
tools: ["avbtool"],
srcs: [
":avbrs_test_image_descriptor",
":avb_cert_test_metadata",
":avb_cert_testkey_psk",
],
out: ["test_vbmeta_cert.img"],
cmd: "$(location avbtool) make_vbmeta_image --key $(location :avb_cert_testkey_psk) --public_key_metadata $(location :avb_cert_test_metadata) --algorithm SHA512_RSA4096 --include_descriptors_from_image $(location :avbrs_test_image_descriptor) --output $(out)",
}
// Standalone vbmeta image signing the test image descriptors for "test_part" and "test_part_2".
genrule {
name: "avbrs_test_vbmeta_2_parts",
tools: ["avbtool"],
srcs: [
":avbrs_test_image_descriptor",
":avbrs_test_image_descriptor_2",
":avb_testkey_rsa4096",
],
out: ["test_vbmeta_2_parts.img"],
cmd: "$(location avbtool) make_vbmeta_image --key $(location :avb_testkey_rsa4096) --algorithm SHA512_RSA4096 --include_descriptors_from_image $(location :avbrs_test_image_descriptor) --include_descriptors_from_image $(location :avbrs_test_image_descriptor_2) --output $(out)",
}
// Standalone vbmeta image signing the test image persistent digest descriptor.
genrule {
name: "avbrs_test_vbmeta_persistent_digest",
tools: ["avbtool"],
srcs: [
":avbrs_test_image_descriptor_persistent_digest",
":avb_testkey_rsa4096",
],
out: ["test_vbmeta_persistent_digest.img"],
cmd: "$(location avbtool) make_vbmeta_image --key $(location :avb_testkey_rsa4096) --algorithm SHA512_RSA4096 --include_descriptors_from_image $(location :avbrs_test_image_descriptor_persistent_digest) --output $(out)",
}
// Standalone vbmeta image with property descriptor "test_prop_key" = "test_prop_value".
genrule {
name: "avbrs_test_vbmeta_with_property",
tools: ["avbtool"],
srcs: [
":avbrs_test_image_descriptor",
":avb_testkey_rsa4096",
],
out: ["test_vbmeta_with_property.img"],
cmd: "$(location avbtool) make_vbmeta_image --prop test_prop_key:test_prop_value --key $(location :avb_testkey_rsa4096) --algorithm SHA512_RSA4096 --include_descriptors_from_image $(location :avbrs_test_image_descriptor) --output $(out)",
}
// Standalone vbmeta image with the test image hashtree descriptor.
genrule {
name: "avbrs_test_vbmeta_with_hashtree",
tools: ["avbtool"],
srcs: [
":avbrs_test_image_descriptor_hashtree",
":avb_testkey_rsa4096",
],
out: ["test_vbmeta_with_hashtree.img"],
cmd: "$(location avbtool) make_vbmeta_image --key $(location :avb_testkey_rsa4096) --algorithm SHA512_RSA4096 --include_descriptors_from_image $(location :avbrs_test_image_descriptor_hashtree) --output $(out)",
}
// Standalone vbmeta image with kernel commandline "test_cmdline_key=test_cmdline_value".
genrule {
name: "avbrs_test_vbmeta_with_commandline",
tools: ["avbtool"],
srcs: [
":avbrs_test_image_descriptor",
":avb_testkey_rsa4096",
],
out: ["test_vbmeta_with_commandline.img"],
cmd: "$(location avbtool) make_vbmeta_image --kernel_cmdline test_cmdline_key=test_cmdline_value --key $(location :avb_testkey_rsa4096) --algorithm SHA512_RSA4096 --include_descriptors_from_image $(location :avbrs_test_image_descriptor) --output $(out)",
}
// Standalone vbmeta image with chain descriptor to "test_part_2" with rollback
// index 4, signed by avb_testkey_rsa8192.
genrule {
name: "avbrs_test_vbmeta_with_chained_partition",
tools: ["avbtool"],
srcs: [
":avbrs_test_image_descriptor",
":avb_testkey_rsa4096",
":avb_testkey_rsa8192_pub_bin",
],
out: ["test_vbmeta_with_chained_partition.img"],
cmd: "$(location avbtool) make_vbmeta_image --chain_partition test_part_2:4:$(location :avb_testkey_rsa8192_pub_bin) --key $(location :avb_testkey_rsa4096) --algorithm SHA512_RSA4096 --include_descriptors_from_image $(location :avbrs_test_image_descriptor) --output $(out)",
}
// Combined test image + signed vbmeta footer for "test_part".
avb_add_hash_footer {
name: "avbrs_test_image_with_vbmeta_footer",
src: ":avbrs_test_image",
partition_name: "test_part",
private_key: ":avb_testkey_rsa4096",
salt: "A000",
}
// Combined test image + signed vbmeta footer for "boot".
avb_add_hash_footer {
name: "avbrs_test_image_with_vbmeta_footer_for_boot",
src: ":avbrs_test_image",
partition_name: "boot",
private_key: ":avb_testkey_rsa4096",
salt: "A001",
}
// Combined test image + signed vbmeta footer for "test_part_2" signed by
// avb_testkey_rsa8192 with rollback index = 7.
avb_add_hash_footer {
name: "avbrs_test_image_with_vbmeta_footer_for_test_part_2",
src: ":avbrs_test_image",
partition_name: "test_part_2",
private_key: ":avb_testkey_rsa8192",
algorithm: "SHA256_RSA8192",
salt: "A002",
rollback_index: 7,
}