| # SPDX-License-Identifier: GPL-2.0+ | |
| # Copyright 2023 Linaro Limited | |
| # | |
| """Bintool implementation for mkeficapsule tool | |
| mkeficapsule is a tool used for generating EFI capsules. | |
| The following are the commandline options to be provided | |
| to the tool | |
| Usage: mkeficapsule [options] <image blob> <output file> | |
| Options: | |
| -g, --guid <guid string> guid for image blob type | |
| -i, --index <index> update image index | |
| -I, --instance <instance> update hardware instance | |
| -v, --fw-version <version> firmware version | |
| -p, --private-key <privkey file> private key file | |
| -c, --certificate <cert file> signer's certificate file | |
| -m, --monotonic-count <count> monotonic count | |
| -d, --dump_sig dump signature (*.p7) | |
| -A, --fw-accept firmware accept capsule, requires GUID, no image blob | |
| -R, --fw-revert firmware revert capsule, takes no GUID, no image blob | |
| -o, --capoemflag Capsule OEM Flag, an integer between 0x0000 and 0xffff | |
| -h, --help print a help message | |
| """ | |
| from binman import bintool | |
| class Bintoolmkeficapsule(bintool.Bintool): | |
| """Handles the 'mkeficapsule' tool | |
| This bintool is used for generating the EFI capsules. The | |
| capsule generation parameters can either be specified through | |
| commandline, or through a config file. | |
| """ | |
| def __init__(self, name): | |
| super().__init__(name, 'mkeficapsule tool for generating capsules', | |
| r'mkeficapsule version (.*)') | |
| def generate_capsule(self, image_index, image_guid, hardware_instance, | |
| payload, output_fname, priv_key, pub_key, | |
| monotonic_count=0, version=0, oemflags=0): | |
| """Generate a capsule through commandline-provided parameters | |
| Args: | |
| image_index (int): Unique number for identifying payload image | |
| image_guid (str): GUID used for identifying the image | |
| hardware_instance (int): Optional unique hardware instance of | |
| a device in the system. 0 if not being used | |
| payload (str): Path to the input payload image | |
| output_fname (str): Path to the output capsule file | |
| priv_key (str): Path to the private key | |
| pub_key(str): Path to the public key | |
| monotonic_count (int): Count used when signing an image | |
| version (int): Image version (Optional) | |
| oemflags (int): Optional 16 bit OEM flags | |
| Returns: | |
| str: Tool output | |
| """ | |
| args = [ | |
| f'--index={image_index}', | |
| f'--guid={image_guid}', | |
| f'--instance={hardware_instance}' | |
| ] | |
| if version: | |
| args += [f'--fw-version={version}'] | |
| if oemflags: | |
| args += [f'--capoemflag={oemflags}'] | |
| if priv_key and pub_key: | |
| args += [ | |
| f'--monotonic-count={monotonic_count}', | |
| f'--private-key={priv_key}', | |
| f'--certificate={pub_key}' | |
| ] | |
| args += [ | |
| payload, | |
| output_fname | |
| ] | |
| return self.run_cmd(*args) | |
| def generate_empty_capsule(self, image_guid, output_fname, | |
| accept=True): | |
| """Generate empty capsules for FWU A/B updates | |
| Args: | |
| image_guid (str): GUID used for identifying the image | |
| in case of an accept capsule | |
| output_fname (str): Path to the output capsule file | |
| accept (bool): Generate an accept capsule, | |
| else a revert capsule | |
| Returns: | |
| str: Tool output | |
| """ | |
| if accept: | |
| args = [ | |
| f'--guid={image_guid}', | |
| '--fw-accept' | |
| ] | |
| else: | |
| args = [ '--fw-revert' ] | |
| args += [ output_fname ] | |
| return self.run_cmd(*args) | |
| def fetch(self, method): | |
| """Fetch handler for mkeficapsule | |
| This builds the tool from source | |
| Returns: | |
| tuple: | |
| str: Filename of fetched file to copy to a suitable directory | |
| str: Name of temp directory to remove, or None | |
| """ | |
| if method != bintool.FETCH_BUILD: | |
| return None | |
| cmd = ['tools-only_defconfig', 'tools'] | |
| result = self.build_from_git( | |
| 'https://source.denx.de/u-boot/u-boot.git', | |
| cmd, | |
| 'tools/mkeficapsule') | |
| return result |