blob: 70aa5ba95684bdeba58aa7f04640665a645e83ff [file] [log] [blame] [edit]
# Copyright 2018 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Chrome OS Image file signing."""
import collections
import logging
from chromite.lib import commandline
from chromite.signing.image_signing import imagefile
class Error(Exception):
"""Base exception for all exceptions in this module."""
# For a given image_type argument, what are the arguments that we
# need to pass to imagefile.SignImage()? Several of the image types
# take very similar parameters. See the dictionary immediately following.
SignArgs = collections.namedtuple(
"SignArgs", ("image_type", "kernel_id", "keyA_prefix")
)
# Dictionary to convert the user's given image_type to the correct arguments for
# image_type, kernel_id, and keyA_prefix to imagefile.Signimage.
SignImageArgs = {
"ssd": SignArgs("SSD", 2, ""),
"base": SignArgs("SSD", 2, ""),
"usb": SignArgs("USB", 2, ""),
"recovery": SignArgs("recovery", 4, "recovery_"),
"factory": SignArgs("factory_install", 2, "installer_"),
"install": SignArgs("factory_install", 2, "installer_"),
}
# All of the valid |image_type| values from the user. Many of these are not
# implemented yet. Since they will be, they get their own exit code.
ValidImageTypes = (
"ssd",
"base",
"usb",
"recovery",
"factory",
"install",
"firmware",
"kernel",
"recovery_kernel",
"update_payload",
"accessory_usbpd",
"accessory_rwsig",
"hps_firmware",
)
def main(argv):
parser = commandline.ArgumentParser(description=__doc__)
parser.add_argument(
"-t",
"--type",
required=True,
dest="image_type",
choices=list(ValidImageTypes),
help="Type of image",
)
parser.add_argument(
"-i",
"--input",
required=True,
dest="input_image",
type="path",
help="Path to input image file",
)
parser.add_argument(
"-k",
"--keyset-dir",
required=True,
dest="key_dir",
help="Path to keyset directory",
)
parser.add_argument(
"-o",
"--output",
required=True,
dest="output_image",
help="Path to output image file",
)
options = parser.parse_args(argv)
options.Freeze()
# See what kind of image this is.
call_args = SignImageArgs.get(options.image_type, None)
if call_args:
imagefile.SignImage(
call_args.image_type,
options.input_image,
options.output_image,
call_args.kernel_id,
options.key_dir,
call_args.keyA_prefix,
)
return 0
# TODO(lamontjones): implement signing for the other supported image types:
# firmware, kernel, recovery_kernel, update_payload,
# accessory_usbpd, accessory_rwsig, hps_firmware.
logging.error("Unimplemented --type %s", options.image_type)
return 2