123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- #!/bin/bash -u
- #
- # Copyright (c) 2012 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.
- #
- # Quick test of vbutil_kernel args, to make sure we can pack and unpack
- # less-than-full-sized components.
- #
- # Load common constants and variables for tests.
- . "$(dirname "$0")/common.sh"
- # directories
- DEVKEYS="${ROOT_DIR}/tests/devkeys"
- DATA_DIR="${SCRIPT_DIR}/preamble_tests/data"
- TMPDIR="${TEST_DIR}/vbutil_kernel_arg_tests_dir"
- [ -d "${TMPDIR}" ] || mkdir -p "${TMPDIR}"
- # Arbitrarily chosen keys and config file.
- KEYBLOCK="${DATA_DIR}/kb_0_0.keyblock"
- SIGNPRIVATE="${DATA_DIR}/data_0.vbprivk"
- SIGNPUBLIC="${DATA_DIR}/root_0.vbpubk"
- CONFIG="${DATA_DIR}/dummy_config.txt"
- # Create some big and little files for the kernel and bootloader
- BIG="${TMPDIR}/big.bin"
- dd if=/dev/urandom bs=32768 count=1 of="${BIG}" 2>/dev/null
- SMALL="${TMPDIR}/small.bin"
- dd if=/dev/urandom bs=16 count=1 of="${SMALL}" 2>/dev/null
- declare -a KERN_VALS
- declare -a BOOT_VALS
- KERN_VALS=("--vmlinuz=${BIG}" "--vmlinuz=${SMALL}")
- BOOT_VALS=("--bootloader=${BIG}" "--bootloader=${SMALL}")
- tests=0
- errs=0
- # Pack a bunch of stuff
- k=0
- while [ "$k" -lt "${#KERN_VALS[*]}" ]; do
- b=0
- while [ "$b" -lt "${#BOOT_VALS[*]}" ]; do
- echo -n "pack kern_${k}_${b}.vblock ... "
- : $(( tests++ ))
- "${FUTILITY}" vbutil_kernel \
- --pack "${TMPDIR}/kern_${k}_${b}.vblock" \
- --keyblock "${KEYBLOCK}" \
- --signprivate "${SIGNPRIVATE}" \
- --version 1 \
- --arch arm \
- --config "${CONFIG}" \
- "${KERN_VALS[$k]}" \
- "${BOOT_VALS[$k]}" >/dev/null
- if [ "$?" -ne 0 ]; then
- echo -e "${COL_RED}FAILED${COL_STOP}"
- : $(( errs++ ))
- else
- echo -e "${COL_GREEN}PASSED${COL_STOP}"
- fi
- : $(( b++ ))
- done
- : $(( k++ ))
- done
- # Now unpack it
- for v in ${TMPDIR}/kern_*.vblock; do
- : $(( tests++ ))
- vv=$(basename "$v")
- echo -n "verify $vv ... "
- "${FUTILITY}" vbutil_kernel --verify "$v" >/dev/null
- if [ "$?" -ne 0 ]; then
- echo -e "${COL_RED}FAILED${COL_STOP}"
- : $(( errs++ ))
- else
- echo -e "${COL_GREEN}PASSED${COL_STOP}"
- fi
- : $(( tests++ ))
- echo -n "verify $vv signed ... "
- "${FUTILITY}" vbutil_kernel --verify "$v" \
- --signpubkey "${SIGNPUBLIC}" >/dev/null
- if [ "$?" -ne 0 ]; then
- echo -e "${COL_RED}FAILED${COL_STOP}"
- : $(( errs++ ))
- else
- echo -e "${COL_GREEN}PASSED${COL_STOP}"
- fi
- done
- # Test repacking a USB image for the SSD, the way the installer does.
- set -e
- # Pack for USB
- USB_KERN="${TMPDIR}/usb_kern.bin"
- USB_KEYBLOCK="${DEVKEYS}/recovery_kernel.keyblock"
- USB_SIGNPRIVATE="${DEVKEYS}/recovery_kernel_data_key.vbprivk"
- USB_SIGNPUBKEY="${DEVKEYS}/recovery_key.vbpubk"
- echo -n "pack USB kernel ... "
- : $(( tests++ ))
- "${FUTILITY}" vbutil_kernel \
- --pack "${USB_KERN}" \
- --keyblock "${USB_KEYBLOCK}" \
- --signprivate "${USB_SIGNPRIVATE}" \
- --version 1 \
- --config "${CONFIG}" \
- --bootloader "${BIG}" \
- --vmlinuz "${BIG}" \
- --arch arm
- if [ "$?" -ne 0 ]; then
- echo -e "${COL_RED}FAILED${COL_STOP}"
- : $(( errs++ ))
- else
- echo -e "${COL_GREEN}PASSED${COL_STOP}"
- fi
- # And verify it.
- echo -n "verify USB kernel ... "
- : $(( tests++ ))
- "${FUTILITY}" vbutil_kernel \
- --verify "${USB_KERN}" \
- --signpubkey "${USB_SIGNPUBKEY}" >/dev/null
- if [ "$?" -ne 0 ]; then
- echo -e "${COL_RED}FAILED${COL_STOP}"
- : $(( errs++ ))
- else
- echo -e "${COL_GREEN}PASSED${COL_STOP}"
- fi
- # Now we re-sign the same image using the normal keys. This is the kernel
- # image that is put on the hard disk by the installer. Note: To save space on
- # the USB image, we're only emitting the new verfication block, and the
- # installer just replaces that part of the hard disk's kernel partition.
- SSD_KERN="${TMPDIR}/ssd_kern.bin"
- SSD_KEYBLOCK="${DEVKEYS}/kernel.keyblock"
- SSD_SIGNPRIVATE="${DEVKEYS}/kernel_data_key.vbprivk"
- SSD_SIGNPUBKEY="${DEVKEYS}/kernel_subkey.vbpubk"
- echo -n "repack to SSD kernel ... "
- : $(( tests++ ))
- "${FUTILITY}" vbutil_kernel \
- --repack "${SSD_KERN}" \
- --vblockonly \
- --keyblock "${SSD_KEYBLOCK}" \
- --signprivate "${SSD_SIGNPRIVATE}" \
- --oldblob "${TMPDIR}/usb_kern.bin" >/dev/null
- if [ "$?" -ne 0 ]; then
- echo -e "${COL_RED}FAILED${COL_STOP}"
- : $(( errs++ ))
- else
- echo -e "${COL_GREEN}PASSED${COL_STOP}"
- fi
- # To verify it, we have to replace the vblock from the original image.
- tempfile="${TMPDIR}/foo.bin"
- cat "${SSD_KERN}" > "$tempfile"
- dd if="${USB_KERN}" bs=65536 skip=1 >> $tempfile 2>/dev/null
- echo -n "verify SSD kernel ... "
- : $(( tests++ ))
- "${FUTILITY}" vbutil_kernel \
- --verify "$tempfile" \
- --signpubkey "${SSD_SIGNPUBKEY}" >/dev/null
- if [ "$?" -ne 0 ]; then
- echo -e "${COL_RED}FAILED${COL_STOP}"
- : $(( errs++ ))
- else
- echo -e "${COL_GREEN}PASSED${COL_STOP}"
- fi
- # Finally make sure that the kernel command line stays good.
- orig=$(cat "${CONFIG}" | tr '\012' ' ')
- packed=$("${FUTILITY}" dump_kernel_config "${USB_KERN}")
- echo -n "check USB kernel config ..."
- : $(( tests++ ))
- if [ "$orig" != "$packed" ]; then
- echo -e "${COL_RED}FAILED${COL_STOP}"
- : $(( errs++ ))
- else
- echo -e "${COL_GREEN}PASSED${COL_STOP}"
- fi
- repacked=$("${FUTILITY}" dump_kernel_config "${tempfile}")
- echo -n "check SSD kernel config ..."
- : $(( tests++ ))
- if [ "$orig" != "$packed" ]; then
- echo -e "${COL_RED}FAILED${COL_STOP}"
- : $(( errs++ ))
- else
- echo -e "${COL_GREEN}PASSED${COL_STOP}"
- fi
- # Summary
- ME=$(basename "$0")
- if [ "$errs" -ne 0 ]; then
- echo -e "${COL_RED}${ME}: ${errs}/${tests} tests failed${COL_STOP}"
- exit 1
- fi
- happy "${ME}: All ${tests} tests passed"
- exit 0
|