#!/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:-
}(): \"${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