blob: 23116daf05f9e3c3f60e763d36fb13afed734cb4 [file] [log] [blame]
#!/bin/sh
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# 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)
KEY=~/trunk/src/platform/ec/board/${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
# 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=`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=`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 "${ro_version}.dev" | dd of=${BOARD}.dev bs=1 seek=$((ro_version_offset)) count=32 conv=notrunc
printf "${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:"
~/trunk/src/platform/vboot_reference/scripts/image_signing/sign_official_build.sh accessory_rwsig ${BOARD}.dev . ${BOARD}.dev.out
mv ${BOARD}.dev.out ${BOARD}.dev
# Show signature
futility show ${BOARD}.dev
echo "Generating image with rollback = 0:"
printf "Current rollback version: "
rb_offset=`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 "${rw_version}.rb0" | dd of=${BOARD}.dev.rb0 bs=1 seek=$((rw_version_offset)) count=32 conv=notrunc
# Resign the image with dev key
~/trunk/src/platform/vboot_reference/scripts/image_signing/sign_official_build.sh accessory_rwsig ${BOARD}.dev.rb0 . ${BOARD}.dev.rb0.out
mv ${BOARD}.dev.rb0.out ${BOARD}.dev.rb0
echo "Generating image with rollback = 1:"
printf "Current rollback version: "
rb_offset=`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 "${rw_version}.rb1" | dd of=${BOARD}.dev.rb1 bs=1 seek=$((rw_version_offset)) count=32 conv=notrunc
# Resign the image with dev key
~/trunk/src/platform/vboot_reference/scripts/image_signing/sign_official_build.sh accessory_rwsig ${BOARD}.dev.rb1 . ${BOARD}.dev.rb1.out
mv ${BOARD}.dev.rb1.out ${BOARD}.dev.rb1
echo "Generating image with rollback = 9:"
printf "Current rollback version: "
rb_offset=`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 "${rw_version}.rb9" | dd of=${BOARD}.dev.rb9 bs=1 seek=$((rw_version_offset)) count=32 conv=notrunc
# Resign the image with dev key
~/trunk/src/platform/vboot_reference/scripts/image_signing/sign_official_build.sh accessory_rwsig ${BOARD}.dev.rb9 . ${BOARD}.dev.rb9.out
mv ${BOARD}.dev.rb9.out ${BOARD}.dev.rb9
echo "Generating image with bits corrupted at start of image:"
cp $IMAGE ${BOARD}_corrupt_first_byte.bin
offset=`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=`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
hexdump -C $image > $image.hex
done