| #!/bin/sh |
| # 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. |
| |
| # gen_test_images.sh BOARD IMAGE |
| # Generate test images from any premp/mp signed image. |
| |
| set -e |
| |
| BOARD=$1 |
| IMAGE=$(readlink -f "$2") |
| DIRNAME=$(dirname "$(readlink -f "$0")") |
| KEY=${DIRNAME}/fingerprint_dev_keys/${BOARD}/dev_key.pem |
| # Increment to different rollback versions |
| ROLLBACK0=00000000 |
| ROLLBACK1=01000000 |
| ROLLBACK9=09000000 |
| |
| rm -rf images |
| mkdir images |
| cd images |
| |
| # Use original image for some tests. |
| cp "${IMAGE}" "${BOARD}.bin" |
| |
| # Use futility included in autotest source no matter if we are in chroot or lxc |
| # container, so that it's easier to notice if things break. |
| alias futility='${DIRNAME}'/futility |
| |
| # Generate dev key set |
| futility create --desc="${BOARD} dev key" "${KEY}" key |
| |
| # Pick up RO and RW version (only take up to 27 bytes, to leave an extra |
| # 4 bytes for .dev/.rbX tag, and terminating \0. |
| ro_version_offset=$(futility dump_fmap "${IMAGE}" RO_FRID | \ |
| sed -n 's/area_offset: *//p') |
| ro_version=$(dd if="${IMAGE}" bs=1 skip=$((ro_version_offset)) count=27) |
| rw_version_offset=$(futility dump_fmap "${IMAGE}" RW_FWID | \ |
| sed -n 's/area_offset: *//p') |
| rw_version=$(dd if="${IMAGE}" bs=1 skip=$((rw_version_offset)) count=27) |
| |
| # Hack the version string |
| cp "${IMAGE}" "${BOARD}.dev" |
| printf '%s' "${ro_version}.dev" | \ |
| dd of="${BOARD}.dev" bs=1 seek=$((ro_version_offset)) count=32 conv=notrunc |
| printf '%s' "${rw_version}.dev" | \ |
| dd of="${BOARD}.dev" bs=1 seek=$((rw_version_offset)) count=32 conv=notrunc |
| |
| # Resign the image with dev key |
| echo "Generating image signed with dev keys:" |
| KEY_NAME=key.vbprik2 |
| futility sign --type rwsig --prikey "${KEY_NAME}" --version 1 "${BOARD}.dev" |
| |
| # Show signature |
| futility show "${BOARD}.dev" |
| |
| echo "Generating image with rollback = 0:" |
| |
| printf "Current rollback version: " |
| rb_offset=$(futility dump_fmap "${BOARD}.dev" RW_RBVER \ |
| | sed -n 's/area_offset: *//p') |
| dd if="${BOARD}.dev" bs=1 skip=$((rb_offset)) count=4 2>/dev/null | xxd -l 4 -p |
| |
| cp "${BOARD}.dev" "${BOARD}.dev.rb0" |
| # Decrement rollback to 0 |
| echo "${ROLLBACK0}" | \ |
| xxd -g 4 -p -r | \ |
| dd of="${BOARD}.dev.rb0" bs=1 seek=$((rb_offset)) count=4 conv=notrunc |
| # Hack the version string |
| printf '%s' "${rw_version}.rb0" | \ |
| dd of="${BOARD}.dev.rb0" bs=1 seek=$((rw_version_offset)) \ |
| count=32 conv=notrunc |
| # Resign the image with dev key |
| futility sign --type rwsig --prikey "${KEY_NAME}" --version 1 "${BOARD}.dev.rb0" |
| |
| |
| echo "Generating image with rollback = 1:" |
| |
| printf "Current rollback version: " |
| rb_offset=$(futility dump_fmap "${BOARD}.dev" RW_RBVER | \ |
| sed -n 's/area_offset: *//p') |
| dd if="${BOARD}.dev" bs=1 skip=$((rb_offset)) count=4 2>/dev/null | xxd -l 4 -p |
| |
| cp "${BOARD}.dev" "${BOARD}.dev.rb1" |
| # Increment rollback to 1 |
| echo "${ROLLBACK1}" | \ |
| xxd -g 4 -p -r | \ |
| dd of="${BOARD}.dev.rb1" bs=1 seek=$((rb_offset)) count=4 conv=notrunc |
| # Hack the version string |
| printf '%s' "${rw_version}.rb1" | \ |
| dd of="${BOARD}.dev.rb1" bs=1 seek=$((rw_version_offset)) \ |
| count=32 conv=notrunc |
| # Resign the image with dev key |
| futility sign --type rwsig --prikey "${KEY_NAME}" --version 1 "${BOARD}.dev.rb1" |
| |
| echo "Generating image with rollback = 9:" |
| |
| printf "Current rollback version: " |
| rb_offset=$(futility dump_fmap "${BOARD}.dev" RW_RBVER | \ |
| sed -n 's/area_offset: *//p') |
| dd if="${BOARD}.dev" bs=1 skip=$((rb_offset)) count=4 2>/dev/null | xxd -l 4 -p |
| |
| cp "${BOARD}.dev" "${BOARD}.dev.rb9" |
| # Increment rollback to 9 |
| echo "${ROLLBACK9}" | \ |
| xxd -g 4 -p -r | \ |
| dd of="${BOARD}.dev.rb9" bs=1 seek=$((rb_offset)) count=4 conv=notrunc |
| # Hack the version string |
| printf '%s' "${rw_version}.rb9" | \ |
| dd of="${BOARD}.dev.rb9" bs=1 seek=$((rw_version_offset)) \ |
| count=32 conv=notrunc |
| # Resign the image with dev key |
| futility sign --type rwsig --prikey "${KEY_NAME}" --version 1 "${BOARD}.dev.rb9" |
| |
| |
| echo "Generating image with bits corrupted at start of image:" |
| cp "${IMAGE}" "${BOARD}_corrupt_first_byte.bin" |
| offset=$(futility dump_fmap "${BOARD}_corrupt_first_byte.bin" EC_RW | \ |
| sed -n 's/area_offset: *//p') |
| dd if=/dev/random of="${BOARD}_corrupt_first_byte.bin" bs=1 \ |
| seek=$((offset+100)) count=1 conv=notrunc |
| |
| echo "Generating image with bits corrupted at end of image:" |
| cp "${IMAGE}" "${BOARD}_corrupt_last_byte.bin" |
| offset=$(futility dump_fmap "${BOARD}_corrupt_last_byte.bin" SIG_RW | \ |
| sed -n 's/area_offset: *//p') |
| dd if=/dev/zero of="${BOARD}_corrupt_last_byte.bin" bs=1 \ |
| seek=$((offset-100)) count=1 conv=notrunc |
| |
| # hexdumps are always nice to have to do diffs |
| for image in "${BOARD}.bin" "${BOARD}_corrupt_first_byte.bin" \ |
| "${BOARD}_corrupt_last_byte.bin" "${BOARD}.dev" "${BOARD}.dev.rb0" \ |
| "${BOARD}.dev.rb1" "${BOARD}.dev.rb9"; do |
| xxd "${image}" > "${image}.hex" |
| done |
| |