verity_utils.py is a standalone binary

verity_utils.py gets an entry point and becomes a host binary. This is
to support signing images from the "bootimg" module type. Previously
this was done by directly invoking "avbtool" from the soong module, but
that required people to know the partition_size priori. The partition
size may not be known before actually building the partition image
especially when the partition is not for a physical partition but for a
partition in a composite image.

verity_utils.py, when the partition_size is not given, is capable of
calculating the mininum required partition size based on the size of the
unsigned input image file.

Bug: 180676957
Test: m microdroid_boot-5.10
Change-Id: I7bef292fb141c90899b7bdc0748895f95f964829
This commit is contained in:
Jiyong Park 2021-03-15 23:13:42 +09:00
parent 82a4cfb397
commit b92b8f48fc
2 changed files with 78 additions and 0 deletions

View File

@ -523,6 +523,23 @@ python_binary_host {
],
}
python_binary_host {
name: "verity_utils",
defaults: ["releasetools_binary_defaults"],
srcs: [
"verity_utils.py",
],
libs: [
"releasetools_common",
],
required: [
"append2simg",
"build_verity_metadata",
"build_verity_tree",
"fec",
],
}
//
// Tests.
//

View File

@ -14,6 +14,12 @@
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Signs a given image using avbtool
Usage: verity_utils properties_file output_image
"""
from __future__ import print_function
import logging
@ -31,6 +37,9 @@ OPTIONS = common.OPTIONS
BLOCK_SIZE = common.BLOCK_SIZE
FIXED_SALT = "aee087a5be3b982978c923f566a94613496b417f2af592639bc80d141e34dfe7"
# From external/avb/avbtool.py
MAX_VBMETA_SIZE = 64 * 1024
MAX_FOOTER_SIZE = 4096
class BuildVerityImageError(Exception):
"""An Exception raised during verity image building."""
@ -714,3 +723,55 @@ def CreateCustomImageBuilder(info_dict, partition_name, partition_size,
signing_args)
return builder
def GetDiskUsage(path):
"""Returns the number of bytes that "path" occupies on host.
Args:
path: The directory or file to calculate size on.
Returns:
The number of bytes based on a 1K block_size.
"""
cmd = ["du", "-b", "-k", "-s", path]
output = common.RunAndCheckOutput(cmd, verbose=False)
return int(output.split()[0]) * 1024
def main(argv):
if len(argv) != 2:
print(__doc__)
sys.exit(1)
common.InitLogging()
dict_file = argv[0]
out_file = argv[1]
prop_dict = {}
with open(dict_file, 'r') as f:
for line in f:
line = line.strip()
if not line or line.startswith("#"):
continue
k, v = line.split("=", 1)
prop_dict[k] = v
builder = CreateVerityImageBuilder(prop_dict)
if "partition_size" not in prop_dict:
image_size = GetDiskUsage(out_file)
# make sure that the image is big enough to hold vbmeta and footer
image_size = image_size + (MAX_VBMETA_SIZE + MAX_FOOTER_SIZE)
size = builder.CalculateDynamicPartitionSize(image_size)
prop_dict["partition_size"] = size
builder.Build(out_file)
if __name__ == '__main__':
try:
main(sys.argv[1:])
finally:
common.Cleanup()