98 lines
2.9 KiB
Bash
Executable file
98 lines
2.9 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# Copyright (C) 2022 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
#
|
|
# Dump boot signature info of a GKI boot image.
|
|
#
|
|
|
|
set -eo errtrace
|
|
|
|
die() {
|
|
echo >&2 "ERROR:" "${@}"
|
|
exit 1
|
|
}
|
|
|
|
TEMP_DIR="$(mktemp -d)"
|
|
readonly TEMP_DIR
|
|
|
|
exit_handler() {
|
|
readonly EXIT_CODE="$?"
|
|
rm -rf "${TEMP_DIR}" ||:
|
|
exit "${EXIT_CODE}"
|
|
}
|
|
|
|
trap exit_handler EXIT
|
|
trap 'die "line ${LINENO}, ${FUNCNAME:-<main>}(): \"${BASH_COMMAND}\" returned \"$?\"" ' ERR
|
|
|
|
get_arg() {
|
|
local arg="$1"
|
|
shift
|
|
while [[ "$#" -gt 0 ]]; do
|
|
if [[ "$1" == "${arg}" ]]; then
|
|
shift
|
|
echo "$1"
|
|
return
|
|
fi
|
|
shift
|
|
done
|
|
}
|
|
|
|
readonly VBMETA_IMAGE="${TEMP_DIR}/boot.boot_signature"
|
|
readonly VBMETA_IMAGE_TEMP="${VBMETA_IMAGE}.temp"
|
|
readonly VBMETA_INFO="${VBMETA_IMAGE}.info"
|
|
readonly BOOT_IMAGE="${TEMP_DIR}/boot.img"
|
|
readonly BOOT_IMAGE_DIR="${TEMP_DIR}/boot.unpack_dir"
|
|
readonly BOOT_IMAGE_ARGS="${TEMP_DIR}/boot.mkbootimg_args"
|
|
readonly BOOT_SIGNATURE_SIZE=$(( 16 << 10 ))
|
|
|
|
[[ -f "$1" ]] ||
|
|
die "expected one input image"
|
|
cp "$1" "${BOOT_IMAGE}"
|
|
|
|
# This could fail if there already is no AVB footer.
|
|
avbtool erase_footer --image "${BOOT_IMAGE}" 2>/dev/null ||:
|
|
|
|
unpack_bootimg --boot_img "${BOOT_IMAGE}" --out "${BOOT_IMAGE_DIR}" \
|
|
--format=mkbootimg -0 > "${BOOT_IMAGE_ARGS}"
|
|
|
|
declare -a boot_args=()
|
|
while IFS= read -r -d '' ARG; do
|
|
boot_args+=("${ARG}")
|
|
done < "${BOOT_IMAGE_ARGS}"
|
|
|
|
BOOT_IMAGE_VERSION="$(get_arg --header_version "${boot_args[@]}")"
|
|
if [[ "${BOOT_IMAGE_VERSION}" -ge 4 ]] && [[ -f "${BOOT_IMAGE_DIR}/boot_signature" ]]; then
|
|
cp "${BOOT_IMAGE_DIR}/boot_signature" "${VBMETA_IMAGE}"
|
|
else
|
|
tail -c "${BOOT_SIGNATURE_SIZE}" "${BOOT_IMAGE}" > "${VBMETA_IMAGE}"
|
|
fi
|
|
|
|
# Keep carving out vbmeta image from the boot signature until we fail or EOF.
|
|
# Failing is fine because there could be padding trailing the boot signature.
|
|
while avbtool info_image --image "${VBMETA_IMAGE}" --output "${VBMETA_INFO}" 2>/dev/null; do
|
|
cat "${VBMETA_INFO}"
|
|
echo
|
|
|
|
declare -i H A X
|
|
H="$(cat "${VBMETA_INFO}" | grep 'Header Block:' | awk '{print $3}')"
|
|
A="$(cat "${VBMETA_INFO}" | grep 'Authentication Block:' | awk '{print $3}')"
|
|
X="$(cat "${VBMETA_INFO}" | grep 'Auxiliary Block:' | awk '{print $3}')"
|
|
vbmeta_size="$(( ${H} + ${A} + ${X} ))"
|
|
|
|
tail -c "+$(( ${vbmeta_size} + 1 ))" "${VBMETA_IMAGE}" > "${VBMETA_IMAGE_TEMP}"
|
|
cp "${VBMETA_IMAGE_TEMP}" "${VBMETA_IMAGE}"
|
|
done
|