| #!/usr/bin/env fuchsia-vendored-python |
| # |
| # Copyright 2022 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Convert avb permanent attributes to software blob |
| |
| Usage: <script> <path to permanent attributes files> <output source file> |
| """ |
| |
| import argparse |
| import sys |
| import textwrap |
| import hashlib |
| |
| PERMANENT_ATTRIBUTE_ARRAY_NAME = "kPermanentAttributes" |
| PERMANENT_ATTRIBUTE_HASH_ARRAY_NAME = "kPermanentAttributesHash" |
| |
| |
| def byte_array_declaration(data: bytes, name: str) -> str: |
| """Generates a C array declaration for bytes""" |
| type_name = "const uint8_t" |
| byte_str = "".join(f"0x{b:02x}," for b in data) |
| array_body = "{%s}" % byte_str |
| return f"{type_name} {name}[] = {array_body};" |
| |
| |
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| |
| parser.add_argument( |
| "permanent_attributes", help="path to permanent attributes file" |
| ) |
| parser.add_argument("out", help="path to output file") |
| |
| return parser.parse_args() |
| |
| |
| def main() -> int: |
| args = parse_args() |
| with open(args.permanent_attributes, "rb") as input_file: |
| attr_data = input_file.read() |
| attr_data_hash = hashlib.sha256(attr_data).digest() |
| |
| with open(args.out, "w") as output_file: |
| output_file.write( |
| textwrap.dedent( |
| """\ |
| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <stdint.h> |
| #include <lib/stdcompat/span.h> |
| |
| namespace { |
| %s |
| %s |
| } |
| |
| namespace gigaboot { |
| const cpp20::span<const uint8_t> GetPermanentAttributes() { |
| return cpp20::span{%s}; |
| } |
| |
| const cpp20::span<const uint8_t> GetPermanentAttributesHash() { |
| return cpp20::span{%s}; |
| } |
| } |
| """ |
| % ( |
| byte_array_declaration( |
| attr_data, PERMANENT_ATTRIBUTE_ARRAY_NAME |
| ), |
| byte_array_declaration( |
| attr_data_hash, PERMANENT_ATTRIBUTE_HASH_ARRAY_NAME |
| ), |
| PERMANENT_ATTRIBUTE_ARRAY_NAME, |
| PERMANENT_ATTRIBUTE_HASH_ARRAY_NAME, |
| ) |
| ) |
| ) |
| |
| return 0 |
| |
| |
| if __name__ == "__main__": |
| sys.exit(main()) |