brillo_update_payload revision 89ff9e3221c358977f9c3124930ee6b559853740
1be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#!/bin/bash
2be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
3be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# Copyright 2015 The Chromium OS Authors. All rights reserved.
4be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# Use of this source code is governed by a BSD-style license that can be
5be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# found in the LICENSE file.
6be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
7be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# Script to generate a Brillo update for use by the update engine.
8be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#
9be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# usage: brillo_update_payload COMMAND [ARGS]
10be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# The following commands are supported:
11be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  generate    generate an unsigned payload
12be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  hash        generate a payload or metadata hash
13be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  sign        generate a signed payload
14be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#
15be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  Generate command arguments:
16be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  --payload       generated unsigned payload output file
17be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  --source_image  if defined, generate a delta payload from the specified
18be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#                  image to the target_image
19be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  --target_image  the target image that should be sent to clients
20be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#
21be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  Hash command arguments:
22be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  --unsigned_payload    the input unsigned payload to generate the hash from
23be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  --signature_size      signature sizes in bytes in the following format:
2489ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#                        "size1:size2[:...]"
25be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  --payload_hash_file   if defined, generate a payload hash and output to the
26be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#                        specified file
27be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  --metadata_hash_file  if defined, generate a metadata hash and output to the
28be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#                        specified file
29be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#
30be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  Sign command arguments:
3189ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#  --unsigned_payload        the input unsigned payload to insert the signatures
3289ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#  --payload                 the output signed payload
3389ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#  --signature_size          signature sizes in bytes in the following format:
3489ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#                            "size1:size2[:...]"
3589ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#  --payload_signature_file  the payload signature files in the following
3689ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#                            format:
3789ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#                            "payload_signature1:payload_signature2[:...]"
3889ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#  --metadata_signature_file the metadata signature files in the following
3989ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#                            format:
4089ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#                            "metadata_signature1:metadata_signature2[:...]"
41be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma#  Note that the number of signature sizes and payload signatures have to match.
42be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
43be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# Load common CrOS utilities.  Inside the chroot this file is installed in
44be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# /usr/lib/crosutils.  This script may also be called from a zipfile, in which
45be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# case common.sh will be in the current directory.
46be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumafind_common_sh() {
47be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  local thisdir="$(dirname "$(readlink -f "$0")")"
48be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  local common_paths=(/usr/lib/crosutils "${thisdir}")
49be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  local path
50be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
51be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  SCRIPT_ROOT="${common_paths[0]}"
52be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  for path in "${common_paths[@]}"; do
53be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    if [[ -r "${path}/common.sh" ]]; then
54be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma      SCRIPT_ROOT="${path}"
55be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma      break
56be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    fi
57be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  done
58be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
59be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  # We have to fake GCLIENT_ROOT in case we're running inside
60be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  # au_zip enviroment. GCLIENT_ROOT detection became fatal.
61be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ "${SCRIPT_ROOT}" == "${thisdir}" ]] && export GCLIENT_ROOT="."
62be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma}
63be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
64be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumafind_common_sh
65be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma. "${SCRIPT_ROOT}/common.sh" || exit 1
66be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
67be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# Check that a command is specified
68be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumaif [[ $# -lt 1 ]]; then
69be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  echo "Please specify a command [generate|hash|sign]"
70be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  exit 1
71be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumafi
72be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
73be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# Parse command
74be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumacase "$1" in
75be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  generate|hash|sign)
76be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    COMMAND=$1
77be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    ;;
78be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  *)
79be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    echo "Unrecognized command:" $1
80be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    exit 1
81be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    ;;
82be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumaesac
83be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
84be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumashift
85be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
86be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# Flags
87be998f47ccb02c5f118f73e79729e9187c39e919Jason KusumaDEFINE_string payload "" "Path to output the generated payload file."
8889ff9e3221c358977f9c3124930ee6b559853740Alex DeymoDEFINE_string target_image "" \
8989ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  "Path to the target image that should be sent to clients."
9089ff9e3221c358977f9c3124930ee6b559853740Alex DeymoDEFINE_string source_image "" \
9189ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  "Optional: Path to a source image. If specified, this makes\
92be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma a delta update."
93be998f47ccb02c5f118f73e79729e9187c39e919Jason KusumaDEFINE_string unsigned_payload "" "Path to the generated unsigned payload."
9489ff9e3221c358977f9c3124930ee6b559853740Alex DeymoDEFINE_string signature_size "" \
9589ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  "Signature sizes in bytes in the following format: size1:size2[:...]"
96be998f47ccb02c5f118f73e79729e9187c39e919Jason KusumaDEFINE_string payload_hash_file "" "Optional: Path to output payload hash file."
9789ff9e3221c358977f9c3124930ee6b559853740Alex DeymoDEFINE_string metadata_hash_file "" \
9889ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  "Optional: Path to output metadata hash file."
9989ff9e3221c358977f9c3124930ee6b559853740Alex DeymoDEFINE_string payload_signature_file "" \
10089ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  "The payload signatures in the following format:\
10189ff9e3221c358977f9c3124930ee6b559853740Alex Deymo payload_signature1:payload_signature2[:...]"
10289ff9e3221c358977f9c3124930ee6b559853740Alex DeymoDEFINE_string metadata_signature_file "" \
10389ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  "The metatada signatures in the following format:\
10489ff9e3221c358977f9c3124930ee6b559853740Alex Deymo metadata_signature1:metadata_signature2[:...]"
105be998f47ccb02c5f118f73e79729e9187c39e919Jason KusumaDEFINE_string work_dir "/tmp" "Where to dump temporary files."
106be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
107be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# Parse command line flag arguments
108be998f47ccb02c5f118f73e79729e9187c39e919Jason KusumaFLAGS "$@" || exit 1
109be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumaeval set -- "${FLAGS_ARGV}"
11089ff9e3221c358977f9c3124930ee6b559853740Alex Deymoset -e
111be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
11289ff9e3221c358977f9c3124930ee6b559853740Alex Deymo# Associative arrays from partition name to file in the source and target
11389ff9e3221c358977f9c3124930ee6b559853740Alex Deymo# images. The size of the updated area must be the size of the file.
11489ff9e3221c358977f9c3124930ee6b559853740Alex Deymodeclare -A SRC_PARTITIONS
11589ff9e3221c358977f9c3124930ee6b559853740Alex Deymodeclare -A DST_PARTITIONS
11689ff9e3221c358977f9c3124930ee6b559853740Alex Deymo
11789ff9e3221c358977f9c3124930ee6b559853740Alex Deymo# A list of temporary files to remove during cleanup.
11889ff9e3221c358977f9c3124930ee6b559853740Alex DeymoCLEANUP_FILES=()
11989ff9e3221c358977f9c3124930ee6b559853740Alex Deymo
12089ff9e3221c358977f9c3124930ee6b559853740Alex Deymo# Create a temporary file in the work_dir with an optional pattern name.
12189ff9e3221c358977f9c3124930ee6b559853740Alex Deymo# Prints the name of the newly created file.
12289ff9e3221c358977f9c3124930ee6b559853740Alex Deymocreate_tempfile() {
12389ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  local pattern="${1:-tempfile.XXXXXX}"
12489ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  mktemp --tmpdir="${FLAGS_work_dir}" "${pattern}"
12589ff9e3221c358977f9c3124930ee6b559853740Alex Deymo}
126be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
127be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumacleanup() {
128be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  local err=""
12989ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  rm -f "${CLEANUP_FILES[@]}" || err=1
130be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
131be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  # If we are cleaning up after an error, or if we got an error during
132be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  # cleanup (even if we eventually succeeded) return a non-zero exit
133be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  # code. This triggers additional logging in most environments that call
134be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  # this script.
135be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  if [[ -n "${err}" ]]; then
136be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    die "Cleanup encountered an error."
137be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  fi
138be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma}
139be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
140be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumacleanup_on_error() {
141be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  trap - INT TERM ERR EXIT
142be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  cleanup
143be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  die "Cleanup success after an error."
144be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma}
145be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
146be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumacleanup_on_exit() {
147be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  trap - INT TERM ERR EXIT
148be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  cleanup
149be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma}
150be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
151be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumatrap cleanup_on_error INT TERM ERR
152be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumatrap cleanup_on_exit EXIT
153be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
15489ff9e3221c358977f9c3124930ee6b559853740Alex Deymo# extract_image_cros <image.bin> <partitions_array>
15589ff9e3221c358977f9c3124930ee6b559853740Alex Deymo#
15689ff9e3221c358977f9c3124930ee6b559853740Alex Deymo# Extract Chromium OS recovery images into new temporary files. Add the list
15789ff9e3221c358977f9c3124930ee6b559853740Alex Deymo# of partition names and its files to the associative array passed in
15889ff9e3221c358977f9c3124930ee6b559853740Alex Deymo# partitions_array.
15989ff9e3221c358977f9c3124930ee6b559853740Alex Deymoextract_image_cros() {
16089ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  local image="$1"
16189ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  local partitions_array="$2"
16289ff9e3221c358977f9c3124930ee6b559853740Alex Deymo
16389ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  local kernel root
16489ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  kernel=$(create_tempfile "kernel.bin.XXXXXX")
16589ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  CLEANUP_FILES+=("${kernel}")
16689ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  root=$(create_tempfile "root.bin.XXXXXX")
16789ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  CLEANUP_FILES+=("${root}")
16889ff9e3221c358977f9c3124930ee6b559853740Alex Deymo
16989ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  cros_generate_update_payload --extract \
17089ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    --image "${image}" \
17189ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    --kern_path "${kernel}" --root_path "${root}" \
17289ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    --work_dir "${FLAGS_work_dir}" --outside_chroot
17389ff9e3221c358977f9c3124930ee6b559853740Alex Deymo
17489ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  # When generating legacy Chrome OS images, we need to use "kernel" and "root"
17589ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  # for the partition names.
17689ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  eval ${partitions_array}[kernel]=\""${kernel}"\"
17789ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  eval ${partitions_array}[root]=\""${root}"\"
17889ff9e3221c358977f9c3124930ee6b559853740Alex Deymo
17989ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  local part varname
18089ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  for part in root kernel; do
18189ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    varname="${partitions_array}[${part}]"
18289ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    printf "md5sum of %s: " "${varname}"
18389ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    md5sum "${!varname}"
18489ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  done
18589ff9e3221c358977f9c3124930ee6b559853740Alex Deymo}
18689ff9e3221c358977f9c3124930ee6b559853740Alex Deymo
187be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumavalidate_generate() {
188be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ -n "${FLAGS_payload}" ]] ||
189be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    die "Error: you must specify an output filename with --payload FILENAME"
190be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
191be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ -n "${FLAGS_target_image}" ]] ||
192be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    die "Error: you must specify a target image with --target_image FILENAME"
193be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma}
194be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
195be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumacmd_generate() {
19689ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  local payload_type="delta"
197be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  if [[ -z "${FLAGS_source_image}" ]]; then
19889ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    payload_type="full"
199be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  fi
200be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
20189ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  echo "Generating ${payload_type} update"
202be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
20389ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  # TODO(deymo): Detect the format the image and call the right extract_image
20489ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  # function.
20589ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  extract_image_cros "${FLAGS_target_image}" DST_PARTITIONS
20689ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  if [[ "${payload_type}" == "delta" ]]; then
20789ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    extract_image_cros "${FLAGS_source_image}" SRC_PARTITIONS
208be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  fi
209be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
210be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  GENERATOR_ARGS=(
211be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    # Common payload args:
212be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    -out_file="${FLAGS_payload}"
213be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    # Target image args:
21489ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    # TODO(deymo): Pass the list of partitions to the generator.
21589ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    -new_image="${DST_PARTITIONS[root]}"
21689ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    -new_kernel="${DST_PARTITIONS[kernel]}"
217be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  )
218be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
21989ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  if [[ "${payload_type}" == "delta" ]]; then
220be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    GENERATOR_ARGS+=(
221be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma      # Source image args:
22289ff9e3221c358977f9c3124930ee6b559853740Alex Deymo      -old_image="${SRC_PARTITIONS[root]}"
22389ff9e3221c358977f9c3124930ee6b559853740Alex Deymo      -old_kernel="${SRC_PARTITIONS[kernel]}"
224be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    )
225be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  fi
226be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
227be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  echo "Running delta_generator with args: ${GENERATOR_ARGS[@]}"
228be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    "${GENERATOR}" "${GENERATOR_ARGS[@]}"
229be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
23089ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  echo "Done generating ${payload_type} update."
231be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma}
232be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
233be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumavalidate_hash() {
234be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ -n "${FLAGS_signature_size}" ]] ||
235be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    die "Error: you must specify signature size with --signature_size SIZES"
236be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
237be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ -n "${FLAGS_unsigned_payload}" ]] ||
238be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    die "Error: you must specify the input unsigned payload with \
239be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma--unsigned_payload FILENAME"
240be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
241be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ -n "${FLAGS_metadata_hash_file}" ]] ||
242be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ -n "${FLAGS_payload_hash_file}" ]] ||
243be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    die "Error: you must specify --metadata_hash_file FILENAME \
244be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumaor --payload_hash_file FILENAME"
245be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma}
246be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
247be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumacmd_hash() {
248be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  if [[ -n "${FLAGS_metadata_hash_file}" ]]; then
249be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    "${GENERATOR}" \
250be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma        -in_file="${FLAGS_unsigned_payload}" \
251be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma        -signature_size="${FLAGS_signature_size}" \
252be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma        -out_metadata_hash_file="${FLAGS_metadata_hash_file}"
253be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  fi
254be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
255be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  if [[ -n "${FLAGS_payload_hash_file}" ]]; then
256be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    "${GENERATOR}" \
257be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma        -in_file="${FLAGS_unsigned_payload}" \
258be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma        -signature_size="${FLAGS_signature_size}" \
259be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma        -out_hash_file="${FLAGS_payload_hash_file}"
260be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  fi
261be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  echo "Done generating hash."
262be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma}
263be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
264be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumavalidate_sign() {
265be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ -n "${FLAGS_signature_size}" ]] ||
266be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    die "Error: you must specify signature size with --signature_size SIZES"
267be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
268be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ -n "${FLAGS_unsigned_payload}" ]] ||
269be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    die "Error: you must specify the input unsigned payload with \
270be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma--unsigned_payload FILENAME"
271be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
272be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ -n "${FLAGS_payload}" ]] ||
273be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    die "Error: you must specify the output signed payload with \
274be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma--payload FILENAME"
275be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
276be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  [[ -n "${FLAGS_payload_signature_file}" ]] ||
277be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma    die "Error: you must specify the payload signature file with \
278be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma--payload_signature_file SIGNATURES"
27989ff9e3221c358977f9c3124930ee6b559853740Alex Deymo
28089ff9e3221c358977f9c3124930ee6b559853740Alex Deymo  [[ -n "${FLAGS_metadata_signature_file}" ]] ||
28189ff9e3221c358977f9c3124930ee6b559853740Alex Deymo    die "Error: you must specify the metadata signature file with \
28289ff9e3221c358977f9c3124930ee6b559853740Alex Deymo--metadata_signature_file SIGNATURES"
283be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma}
284be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
285be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumacmd_sign() {
286be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  "${GENERATOR}" \
287be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma      -in_file="${FLAGS_unsigned_payload}" \
288be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma      -signature_size="${FLAGS_signature_size}" \
289be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma      -signature_file="${FLAGS_payload_signature_file}" \
29089ff9e3221c358977f9c3124930ee6b559853740Alex Deymo      -metadata_signature_file="${FLAGS_metadata_signature_file}" \
291be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma      -out_file="${FLAGS_payload}"
292be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  echo "Done signing payload."
293be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma}
294be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
295be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# TODO: Extract the input zip files once the format is finalized
296be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
297be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma# Sanity check that the real generator exists:
298be998f47ccb02c5f118f73e79729e9187c39e919Jason KusumaGENERATOR="$(which delta_generator)"
299be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma[[ -x "${GENERATOR}" ]] || die "can't find delta_generator"
300be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma
301be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumacase "$COMMAND" in
302be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  generate) validate_generate
303be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma            cmd_generate
304be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma            ;;
305be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  hash) validate_hash
306be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma        cmd_hash
307be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma        ;;
308be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma  sign) validate_sign
309be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma        cmd_sign
310be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusuma        ;;
311be998f47ccb02c5f118f73e79729e9187c39e919Jason Kusumaesac
312