tools: binman: add 'fit, encrypt' property to pass keys directory to mkimage
mkimage can be used for both signing the FIT or encrypt its content and the option '-k' can be used to pass a directory where both signing and encryption keys can be retrieved. Adding 'fit,encrypt' property to the 'fit' node, leads to try to find keys directory among binman include directories. _get_priv_keys_dir() is renamed as _get_keys_dir() and adapted to support both signing and encryption nodes in the FIT. Signed-off-by: Paul HENRYS <paul.henrys_ext@softathome.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -22,7 +22,7 @@ class Bintoolmkimage(bintool.Bintool):
|
|||||||
|
|
||||||
# pylint: disable=R0913
|
# pylint: disable=R0913
|
||||||
def run(self, reset_timestamp=False, output_fname=None, external=False,
|
def run(self, reset_timestamp=False, output_fname=None, external=False,
|
||||||
pad=None, align=None, priv_keys_dir=None):
|
pad=None, align=None, keys_dir=None):
|
||||||
"""Run mkimage
|
"""Run mkimage
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@@ -34,7 +34,7 @@ class Bintoolmkimage(bintool.Bintool):
|
|||||||
other things to be easily added later, if required, such as
|
other things to be easily added later, if required, such as
|
||||||
signatures
|
signatures
|
||||||
align: Bytes to use for alignment of the FIT and its external data
|
align: Bytes to use for alignment of the FIT and its external data
|
||||||
priv_keys_dir: Path to directory containing private keys
|
keys_dir: Path to directory containing private and encryption keys
|
||||||
version: True to get the mkimage version
|
version: True to get the mkimage version
|
||||||
"""
|
"""
|
||||||
args = []
|
args = []
|
||||||
@@ -46,8 +46,8 @@ class Bintoolmkimage(bintool.Bintool):
|
|||||||
args += ['-B', f'{align:x}']
|
args += ['-B', f'{align:x}']
|
||||||
if reset_timestamp:
|
if reset_timestamp:
|
||||||
args.append('-t')
|
args.append('-t')
|
||||||
if priv_keys_dir:
|
if keys_dir:
|
||||||
args += ['-k', f'{priv_keys_dir}']
|
args += ['-k', f'{keys_dir}']
|
||||||
if output_fname:
|
if output_fname:
|
||||||
args += ['-F', output_fname]
|
args += ['-F', output_fname]
|
||||||
return self.run_cmd(*args)
|
return self.run_cmd(*args)
|
||||||
|
@@ -871,6 +871,13 @@ The top-level 'fit' node supports the following special properties:
|
|||||||
-k flag. All the keys required for signing FIT must be available at
|
-k flag. All the keys required for signing FIT must be available at
|
||||||
time of signing and must be located in single include directory.
|
time of signing and must be located in single include directory.
|
||||||
|
|
||||||
|
fit,encrypt
|
||||||
|
Enable data encryption in FIT images via mkimage. If the property
|
||||||
|
is found, the keys path is detected among binman include
|
||||||
|
directories and passed to mkimage via -k flag. All the keys
|
||||||
|
required for encrypting the FIT must be available at the time of
|
||||||
|
encrypting and must be located in a single include directory.
|
||||||
|
|
||||||
Substitutions
|
Substitutions
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@@ -110,6 +110,13 @@ class Entry_fit(Entry_section):
|
|||||||
available at time of signing and must be located in single include
|
available at time of signing and must be located in single include
|
||||||
directory.
|
directory.
|
||||||
|
|
||||||
|
fit,encrypt
|
||||||
|
Enable data encryption in FIT images via mkimage. If the property
|
||||||
|
is found, the keys path is detected among binman include
|
||||||
|
directories and passed to mkimage via -k flag. All the keys
|
||||||
|
required for encrypting the FIT must be available at the time of
|
||||||
|
encrypting and must be located in a single include directory.
|
||||||
|
|
||||||
Substitutions
|
Substitutions
|
||||||
~~~~~~~~~~~~~
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -518,14 +525,14 @@ class Entry_fit(Entry_section):
|
|||||||
# are removed from self._entries later.
|
# are removed from self._entries later.
|
||||||
self._priv_entries = dict(self._entries)
|
self._priv_entries = dict(self._entries)
|
||||||
|
|
||||||
def _get_priv_keys_dir(self, data):
|
def _get_keys_dir(self, data):
|
||||||
"""Detect private keys path among binman include directories
|
"""Detect private and encryption keys path among binman include directories
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
data: FIT image in binary format
|
data: FIT image in binary format
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
str: Single path containing all private keys found or None
|
str: Single path containing all keys found or None
|
||||||
|
|
||||||
Raises:
|
Raises:
|
||||||
ValueError: Filename 'rsa2048.key' not found in input path
|
ValueError: Filename 'rsa2048.key' not found in input path
|
||||||
@@ -533,11 +540,14 @@ class Entry_fit(Entry_section):
|
|||||||
"""
|
"""
|
||||||
def _find_keys_dir(node):
|
def _find_keys_dir(node):
|
||||||
for subnode in node.subnodes:
|
for subnode in node.subnodes:
|
||||||
if subnode.name.startswith('signature'):
|
if (subnode.name.startswith('signature') or
|
||||||
|
subnode.name.startswith('cipher')):
|
||||||
if subnode.props.get('key-name-hint') is None:
|
if subnode.props.get('key-name-hint') is None:
|
||||||
continue
|
continue
|
||||||
hint = subnode.props['key-name-hint'].value
|
hint = subnode.props['key-name-hint'].value
|
||||||
name = tools.get_input_filename(f"{hint}.key")
|
name = tools.get_input_filename(
|
||||||
|
f"{hint}.key" if subnode.name.startswith('signature')
|
||||||
|
else f"{hint}.bin")
|
||||||
path = os.path.dirname(name)
|
path = os.path.dirname(name)
|
||||||
if path not in paths:
|
if path not in paths:
|
||||||
paths.append(path)
|
paths.append(path)
|
||||||
@@ -587,8 +597,9 @@ class Entry_fit(Entry_section):
|
|||||||
align = self._fit_props.get('fit,align')
|
align = self._fit_props.get('fit,align')
|
||||||
if align is not None:
|
if align is not None:
|
||||||
args.update({'align': fdt_util.fdt32_to_cpu(align.value)})
|
args.update({'align': fdt_util.fdt32_to_cpu(align.value)})
|
||||||
if self._fit_props.get('fit,sign') is not None:
|
if (self._fit_props.get('fit,sign') is not None or
|
||||||
args.update({'priv_keys_dir': self._get_priv_keys_dir(data)})
|
self._fit_props.get('fit,encrypt') is not None):
|
||||||
|
args.update({'keys_dir': self._get_keys_dir(data)})
|
||||||
if self.mkimage.run(reset_timestamp=True, output_fname=output_fname,
|
if self.mkimage.run(reset_timestamp=True, output_fname=output_fname,
|
||||||
**args) is None:
|
**args) is None:
|
||||||
if not self.GetAllowMissing():
|
if not self.GetAllowMissing():
|
||||||
|
Reference in New Issue
Block a user